SQL:Помощь с вложенными запросами
-
21-09-2019 - |
Вопрос
Вот моя схема:
Поставщики (сид:целое число, снэйм:строка, адресная строка)
Части(пид:целое число, pname ( имя пользователя ):строка, цвет:строка)
Каталог(сид:целое число, pid:целое число, стоимость:настоящий)
смелый указывает на первичный ключ.
Я хочу написать запрос, чтобы найти всех поставщиков, которые поставляют каждую деталь.Вот два запроса, которые у меня уже есть:
-- get all parts for a given supplier
SELECT Parts.pid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Suppliers.sid = 4;
-- gets all parts that exist
SELECT Parts.pid
FROM Parts
То, что я хочу сделать, в императивных терминах, это что-то вроде этого:
Define result set
Foreach Supplier:
If the list of parts produced by a supplier
is equal to the total list of parts, add this supplier to the result set
Return result set
Как я могу перевести это в MySQL?
Решение
Использование:
SELECT s.*
FROM SUPPLIER s
JOIN (SELECT c.sid,
COUNT(c.pid) AS num_parts
FROM CATALOG c
GROUP BY c.sid) x ON x.sid = s.sid
JOIN (SELECT COUNT(*) AS total_parts
FROM PARTS) y ON y.total_parts = x.num_parts
Другие советы
Не уверен, как это переводится в MySQL, но что-то в этом роде:
select s.sname, PartCount from (
select s.SID, s.sname, PartCount = sum(p.PID)
inner join Catalog c on c.SID = s.SID
inner join Parts p on p.PID = c.PID
where s.SID = 4
group by s.SID
) a
where PartCount = MAX(PartCount)
Примечание. обозначение подзапроса 'a' является произвольным именем, поскольку MSSQL по какой-то причине требует имен в своих подзапросах.Не знаю, как это работает в MySQL.
Попробуйте (непроверенный):
SELECT s.*
FROM (
SELECT sid, count(pid) as c
FROM Catalog
GROUP BY sid) q1
JOIN Suppliers s ON s.sid = q1.sid
WHERE q1.c = (SELECT COUNT(*) FROM Parts)
Попробуй:
SELECT Suppliers.sid
FROM Suppliers
INNER JOIN
(SELECT sid, COUNT(pid) as num
FROM Catalog
GROUP BY sid)as t1
ON Suppliers.sid = t1.sid
WHERE t1.num =
(SELECT COUNT(pid) FROM Parts)