Here is my diagram:
Providers ( sid: integer , sname: string, address bar)
Parts ( pid: integer , pname: string, color: string)
Directory ( sid: integer , pid: integer, cost: real)
Primary keys are in bold.
Here is the MySQL query I'm working with:
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;
Subqueries from both sides of the operator are UNIONdisgustingly repeated. In imperative programming, this would be a good place to create a function, taking color as a parameter. What is equivalent to this in MySQL?
I have heard of “views,” but I think that may be redundant for this case.