Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL non valida:livello di nidificazione troppo alto per selezionare

Potrebbe essere correlato abug MySQL #41156, l'elenco di tabelle derivate si comporta come una catena di -sottoquery nidificate .

Il registro dei bug indica che è stato verificato rispetto a MySQL 5.0.72, 5.1.30 e 6.0.7.
Risolto in MySQL 5.1.37, MySQL 5.4.2 (divenuto 5.5.qualcosa) e NDB 7.1.0 .

Per quanto riguarda la tua query riprogettata nella domanda precedente:

Le query pivot possono essere complicate. Puoi utilizzare il metodo suggerito da Andrew nella la sua risposta . Se cerchi molti valori UPC, devi scrivere il codice dell'applicazione per creare la query SQL, aggiungendo tante clausole JOIN quanti sono i valori UPC che stai cercando.

MySQL ha un limite al numero di join che possono essere eseguiti in una singola query, ma l'esempio che dovresti non raggiunge il limite. Cioè, la query che mostri funziona.

Presumo che tu stia mostrando una query di esempio alla ricerca di quattro codici UPC, mentre la tua app potrebbe creare la query in modo dinamico per un numero maggiore di codici UPC e talvolta potrebbe essere più di 61.

Sembra che l'obiettivo della tua query sia restituire i negozi che hanno almeno uno dei codici UPC elencati. Puoi farlo più semplicemente nella seguente 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');

Puoi utilizzare questo metodo in altri modi, ad esempio per trovare negozi che hanno tutti e quattro gli 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;

O per trovare negozi che alcuni ma non tutti e quattro gli 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;

Oppure per trovare negozi privi di tutti e quattro gli 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;

Devi ancora scrivere del codice per creare questa query, ma è un po' più semplice da fare e non supera alcun limite sul numero di join o sottoquery che puoi eseguire.