Mysql вопрос подзапроса - PullRequest
       25

Mysql вопрос подзапроса

0 голосов
/ 13 марта 2009

Учитывая эти две таблицы:

Foo (id, name)       -- PK = id
Bar (fooId, value)   -- PK = composite, fooId + value
                     -- value is a non-negative int

Как я могу найти все Foo.name s, где нет соответствующих 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

Ответы [ 4 ]

2 голосов
/ 13 марта 2009
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».

1 голос
/ 13 марта 2009

Мне легче читать и понимать следующее ...

SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
                  FROM bar
                  WHERE bar.fooid = foo.id
                    AND bar.value > 0)
1 голос
/ 13 марта 2009
SELECT name FROM FOO WHERE id NOT IN(
    SELECT fooId FROM Bar GROUP BY fooId HAVING MAX(Value) > 0)
0 голосов
/ 13 марта 2009
select Foo.name 
from Foo
where Foo.id not in 
(select Bar.fooid from Bar
where value > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...