Вопрос о подзапросе Mysql
Вопрос
Учитывая эти две таблицы:
Foo (id, name) -- PK = id
Bar (fooId, value) -- PK = composite, fooId + value
-- value is a non-negative int
Как мне найти все Foo.name
где нет соответствующего Bar,value
выше 0?
например:
Foo
id name
1 a
2 b
3 c
Bar
fooid value
1 0
1 1
2 0
3 4
Result:
b
Решение
Я считаю, что следующее легче всего читать и понимать...
SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
FROM bar
WHERE bar.fooid = foo.id
AND bar.value > 0)
Другие советы
SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0
Выполнение этого запроса и запроса, опубликованного zodeus, занимает примерно одинаковое время, однако он не будет включать записи Foo, на которые не ссылается таблица Bar.Например, если у вас также есть запись Foo ( 4, d ), этот запрос все равно вернет «b», тогда как запрос zodeus вернет «b» и «d».
SELECT name FROM FOO WHERE id NOT IN(
SELECT fooId FROM Bar GROUP BY fooId HAVING MAX(Value) > 0)
select Foo.name
from Foo
where Foo.id not in
(select Bar.fooid from Bar
where value > 0)
Не связан с StackOverflow