Voici mon schéma:MySQL: Comment condenser cette requête verbeuse?
Fournisseurs (sid: entiers, sname: string, chaîne d'adresse)
Pièces (pid: entiers, pname: string, couleur: string)
catalogue (sid: entier, pid: entier, coût: real)
clés primaires en gras.
Voici la requête MySQL Je travaille avec:
-- Find the sids of suppliers who supply every red part or supply every green part.
-- this isn't DRY
-- not tested
SELECT Suppliers.sid
FROM Suppliers
JOIN (SELECT sid, COUNT(Parts.pid) AS partsPerSupplier
FROM Catalog
JOIN Parts on Catalog.pid = Parts.pid
WHERE Parts.color = "red"
GROUP BY sid)
AS partCounts ON Suppliers.sid = partCounts.sid
JOIN (SELECT COUNT(pid) AS totalParts
FROM Parts
WHERE color = "red"
) AS totalPartsTable ON totalPartsTable.totalParts = partCounts.partsPerSupplier
UNION
SELECT Suppliers.sid
FROM Suppliers
JOIN (SELECT sid, COUNT(Parts.pid) AS partsPerSupplier
FROM Catalog
JOIN Parts on Catalog.pid = Parts.pid
WHERE Parts.color = "green"
GROUP BY sid)
AS partCounts ON Suppliers.sid = partCounts.sid
JOIN (SELECT COUNT(pid) AS totalParts
FROM Parts
WHERE color = "green"
) AS totalPartsTable ON totalPartsTable.totalParts = partCounts.partsPerSupplier;
Les sous-requêtes de chaque côté de la déclaration UNION
sont hideusement répétées. Dans la programmation impérative, ce serait un bon endroit pour faire une fonction, en prenant la couleur comme paramètre. Quel est l'équivalent de ceci dans MySQL?
J'ai entendu parler de « vues », mais je pense que cela pourrait être surpuissant pour ce cas.
Pouvez-vous expliquer comment cette requête fonctionne? –
Cela provoque un message d'erreur: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'LEFT JOIN catalogue c ON c.pid = p.pi' à la ligne 19 –
@Rosarch: essayez maintenant. – Quassnoi