sql >> Databáze >  >> RDS >> Mysql

MySQL Neplatný dotaz:Příliš vysoká úroveň vnoření pro výběr

Může souviset schybou MySQL #41156, seznam odvozených tabulek funguje jako řetězec vzájemně -vnořené poddotazy .

Protokol chyb ukazuje, že byl ověřen proti MySQL 5.0.72, 5.1.30 a 6.0.7.
Opraveno v MySQL 5.1.37, MySQL 5.4.2 (ze kterého se stalo 5.5.něco) a NDB 7.1.0 .

Pokud jde o váš přepracovaný dotaz v otázce výše:

Kontingenční dotazy mohou být složité. Můžete použít metodu navrženou Andrewem v jeho odpovědi . Pokud hledáte mnoho hodnot UPC, musíte napsat kód aplikace pro sestavení dotazu SQL a připojit tolik klauzulí JOIN, kolik hodnot UPC hledáte.

MySQL má limit na počet spojení, která lze provést v jednom dotazu, ale příklad, který byste měli, limitu nedosahuje. To znamená, že vámi zobrazený dotaz funguje.

Předpokládám, že ukazujete příklad dotazu, který hledá čtyři kódy UPC, zatímco vaše aplikace může vytvořit dotaz dynamicky pro větší počet kódů UPC, který může být někdy i více než 61.

Zdá se, že cílem vašeho dotazu je vrátit obchody, které mají alespoň jeden z uvedených kódů UPC. Můžete to udělat jednodušeji v následujícím dotazu:

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

Tuto metodu můžete použít i jinými způsoby, například k nalezení obchodů, které mají všechny čtyři UPC:

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;

Nebo najít obchody, které některé, ale ne všechny čtyři UPC:

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;

Nebo najít obchody, které postrádají všechny čtyři UPC:

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;

K sestavení tohoto dotazu stále musíte napsat nějaký kód, ale je to o něco jednodušší a nepřekračuje to žádná omezení počtu spojení nebo poddotazů, které můžete spustit.



  1. Proč TRANSACTION / COMMIT tolik zlepšuje výkon s PHP/MySQL (InnoDB)?

  2. Při pokusu o získání dat z databáze MySQL pomocí PHP se nezobrazují hodnoty koláčového grafu HighCharts

  3. Rychlý způsob generování zřetězených řetězců v Oracle

  4. POSTUP:Spouštění naplánovaných úloh pomocí aplikace Microsoft Access