Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL non valide :trop haut niveau d'imbrication pour select

Pourrait être lié àBogue MySQL #41156, la liste des tables dérivées agit comme une chaîne de -sous-requêtes imbriquées .

Le journal des bogues indique qu'il a été vérifié par rapport à MySQL 5.0.72, 5.1.30 et 6.0.7.
Corrigé dans MySQL 5.1.37, MySQL 5.4.2 (qui est devenu 5.5.something) et NDB 7.1.0 .

Concernant votre requête repensée dans la question ci-dessus :

Les requêtes pivot peuvent être délicates. Vous pouvez utiliser la méthode suggérée par Andrew dans sa réponse . Si vous recherchez de nombreuses valeurs UPC, vous devez écrire du code d'application pour créer la requête SQL, en ajoutant autant de clauses JOIN que le nombre de valeurs UPC que vous recherchez.

MySQL a une limite sur le nombre de jointures pouvant être effectuées dans une seule requête, mais l'exemple que vous devriez atteindre n'atteint pas la limite. Autrement dit, la requête que vous affichez fonctionne.

Je suppose que vous montrez un exemple de requête recherchant quatre codes UPC, alors que votre application peut construire la requête dynamiquement pour un plus grand nombre de codes UPC, et cela peut parfois être supérieur à 61.

Il semble que l'objectif de votre requête soit de renvoyer les magasins qui ont au moins un des codes UPC répertoriés. Vous pouvez le faire plus simplement dans la requête suivante :

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

Vous pouvez utiliser cette méthode d'autres manières, par exemple pour trouver des magasins qui ont les quatre codes 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;

Ou pour trouver des magasins qui ont certains UPC, mais pas tous :

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;

Ou pour trouver des magasins qui n'ont pas les quatre codes 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;

Vous devez encore écrire du code pour créer cette requête, mais c'est un peu plus facile à faire et cela ne dépasse aucune limite sur le nombre de jointures ou de sous-requêtes que vous pouvez exécuter.