pergunta subconsulta Mysql
Pergunta
Tendo em conta estas duas tabelas:
Foo (id, name) -- PK = id
Bar (fooId, value) -- PK = composite, fooId + value
-- value is a non-negative int
Como posso encontrar todos os Foo.name
s onde não há Bar,value
correspondente acima de 0?
por exemplo:
Foo
id name
1 a
2 b
3 c
Bar
fooid value
1 0
1 1
2 0
3 4
Result:
b
Solução
Eu acho o seguinte o mais fácil de ler e entender ...
SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
FROM bar
WHERE bar.fooid = foo.id
AND bar.value > 0)
Outras dicas
SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0
Esta consulta eo postado por zodeus tomada sobre o mesmo período de tempo para executar, no entanto esta não inclui quaisquer registros Foo que não são referenciados pela tabela de Bar. Por exemplo, se você também teve o registro Foo (4, d), esta consulta ainda retornar 'b', onde, como consulta de zodeus voltaria 'b' e '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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow