Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Ungültige Abfrage:Zu hohe Verschachtelungsebene für select

Könnte mit MySQL-Fehler Nr. 41156 zusammenhängen. Die Liste der abgeleiteten Tabellen verhält sich wie eine Kette von gegenseitigen -verschachtelte Unterabfragen .

Das Fehlerprotokoll weist darauf hin, dass es mit MySQL 5.0.72, 5.1.30 und 6.0.7 verifiziert wurde.
Behoben in MySQL 5.1.37, MySQL 5.4.2 (das zu 5.5.something wurde) und NDB 7.1.0 .

Zu Ihrer neu gestalteten Abfrage in der obigen Frage:

Pivot-Abfragen können schwierig sein. Sie können die von Andrew in seiner Antwort vorgeschlagene Methode verwenden . Wenn Sie nach vielen UPC-Werten suchen, müssen Sie Anwendungscode schreiben, um die SQL-Abfrage zu erstellen, und so viele JOIN-Klauseln anhängen, wie Sie nach UPC-Werten suchen.

MySQL hat eine Begrenzung für die Anzahl der Joins, die in einer einzigen Abfrage ausgeführt werden können, aber das Beispiel, das Sie verwenden sollten, erreicht die Begrenzung nicht. Das heißt, die von Ihnen angezeigte Abfrage funktioniert.

Ich gehe davon aus, dass Sie eine Beispielabfrage zeigen, die nach vier UPC-Codes sucht, während Ihre App die Abfrage möglicherweise dynamisch für eine größere Anzahl von UPC-Codes erstellt, und das kann manchmal mehr als 61 sein.

Anscheinend besteht das Ziel Ihrer Abfrage darin, Geschäfte zurückzugeben, die mindestens einen der aufgelisteten UPC-Codes haben. Einfacher geht das in der folgenden Abfrage:

SELECT DISTINCT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');

Sie können diese Methode auch auf andere Weise verwenden, beispielsweise um Geschäfte zu finden, die alle vier UPCs haben:

SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) = 4;

Oder um Geschäfte zu finden, die einige, aber nicht alle vier UPCs enthalten:

SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) < 4;

Oder um Geschäfte zu finden, denen alle vier UPCs fehlen:

SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
WHERE cr.e_address IS NULL;

Sie müssen immer noch etwas Code schreiben, um diese Abfrage zu erstellen, aber es ist etwas einfacher und überschreitet keine Beschränkungen für die Anzahl der Verknüpfungen oder Unterabfragen, die Sie ausführen können.