sql >> Database >  >> RDS >> Mysql

MySQL Ongeldige zoekopdracht:te hoog niveau van nesten voor select

Kan gerelateerd zijn aanMySQL-bug #41156, Lijst met afgeleide tabellen werkt als een keten van onderling -geneste subquery's .

Het buglogboek geeft aan dat het is geverifieerd met MySQL 5.0.72, 5.1.30 en 6.0.7.
Opgelost in MySQL 5.1.37, MySQL 5.4.2 (dat 5.5.iets werd) en NDB 7.1.0 .

Met betrekking tot uw opnieuw ontworpen zoekopdracht in de bovenstaande vraag:

Pivotquery's kunnen lastig zijn. Je kunt de methode gebruiken die door Andrew is voorgesteld in zijn antwoord . Als u naar veel UPC-waarden zoekt, moet u toepassingscode schrijven om de SQL-query te bouwen, waarbij u evenveel JOIN-clausules toevoegt als het aantal UPC-waarden waarnaar u zoekt.

MySQL heeft een limiet voor het aantal joins dat in een enkele query kan worden gedaan, maar het voorbeeld dat u zou moeten bereiken, bereikt de limiet niet. Dat wil zeggen, de zoekopdracht die u laat zien, werkt.

Ik neem aan dat je een voorbeeldquery laat zien waarin naar vier UPC-codes wordt gezocht, terwijl je app de zoekopdracht dynamisch kan construeren voor een groter aantal UPC-codes, en dat kan soms meer dan 61 zijn.

Het lijkt erop dat het doel van uw zoekopdracht is om winkels te retourneren die ten minste een van de vermelde UPC-codes hebben. U kunt dat eenvoudiger doen in de volgende query:

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');

U kunt deze methode op andere manieren gebruiken, bijvoorbeeld om winkels te vinden die alle vier de UPC's hebben:

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;

Of om winkels te vinden die sommige, maar niet alle vier de UPC's hebben:

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;

Of om winkels te vinden die alle vier de UPC's missen:

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;

Je moet nog steeds wat code schrijven om deze query te maken, maar het is een beetje makkelijker om te doen, en het overschrijdt geen enkele limiet voor het aantal joins of subquery's dat je kunt uitvoeren.



  1. MySQL-clienttoepassingen gebruiken

  2. Android Room Database, haal specifieke waarde op van het laatst ingevoerde record

  3. MAX() vs GREATEST() in MySQL:wat is het verschil?

  4. De juiste manier om een ​​unieke beperking te implementeren die meerdere NULL-waarden in SQL Server toestaat