Question de sous-requête Mysql
Question
Étant donné ces deux tableaux:
Foo (id, name) -- PK = id
Bar (fooId, value) -- PK = composite, fooId + value
-- value is a non-negative int
Comment puis-je trouver tous les Foo.name
où aucun Bar, valeur
supérieur à 0 ne correspond?
par exemple:
Foo
id name
1 a
2 b
3 c
Bar
fooid value
1 0
1 1
2 0
3 4
Result:
b
La solution
Je trouve que ce qui suit est le plus facile à lire et à comprendre ...
SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
FROM bar
WHERE bar.fooid = foo.id
AND bar.value > 0)
Autres conseils
SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0
L'exécution de cette requête et de celle publiée par zodeus prend environ le même temps, mais celle-ci n'inclura aucun enregistrement Foo non référencé par la table Bar. Par exemple, si vous avez également l'enregistrement Foo (4, d), cette requête renvoie toujours 'b', tandis que la requête de zodeus renverrait 'b' et '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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow