Kan vara relaterat tillMySQL-fel #41156, Lista över härledda tabeller fungerar som en kedja av ömsesidigt -kapslade underfrågor .
Buggloggen indikerar att den har verifierats mot MySQL 5.0.72, 5.1.30 och 6.0.7.
Fastad i MySQL 5.1.37, MySQL 5.4.2 (som blev 5.5.någonting) och NDB 7.1.0 .
Angående din omdesignade fråga i frågan ovan:
Pivotfrågor kan vara knepiga. Du kan använda metoden som föreslagits av Andrew i hans svar . Om du söker efter många UPC-värden måste du skriva applikationskod för att bygga SQL-frågan och lägga till lika många JOIN-satser som antalet UPC-värden du söker efter.
MySQL har visserligen en gräns för antalet anslutningar som kan göras i en enda fråga, men exemplet du bör når inte gränsen. Det vill säga att frågan du visar fungerar.
Jag antar att du visar en exempelfråga som söker efter fyra UPC-koder, medan din app kan konstruera frågan dynamiskt för ett större antal UPC-koder, och det kan vara fler än 61 ibland.
Det verkar som att målet med din fråga är att returnera butiker som har minst en av de listade UPC-koderna. Du kan göra det enklare i följande fråga:
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');
Du kan använda den här metoden på andra sätt, till exempel för att hitta butiker som har alla fyra UPC:erna:
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;
Eller för att hitta butiker som vissa men inte alla fyra UPC:er:
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;
Eller för att hitta butiker som saknar alla fyra UPC:erna:
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;
Du måste fortfarande skriva lite kod för att bygga den här frågan, men det är lite lättare att göra och det överskrider inte några gränser för antalet anslutningar eller underfrågor du kan köra.