在MySQL上非常糟糕,因为我只在oracle dbs上完成了轻量级网页设计和SQL。说我有一张表列出了人们喜欢的所有水果。
name fruit
------------
john bananas
john oranges
marcy bananas
dave oranges
lucy bananas
lucy oranges
说我想得到所有喜欢橙子的人的名字,但没有说明他们是否喜欢香蕉。这张表中只有两种可能的结果。 (它可能扩展到更多,但通常只有两个)。
查询是什么?我想要一个只返回“dave”的查询,因为marcy只指定她喜欢香蕉,而john和lucy说他们都喜欢。我认为我不需要加入,因为这只是一张桌子。
我正在尝试
select name from table
where(--uhm.. use the stuff below somehow
select name from table
where fruit like 'bananas';
select name from table
where fruit like 'oranges';
)
我也非常满意这样一个查询,它返回了所有喜欢橙子但不喜欢香蕉或香蕉而不是橙子的人。我不知道哪个查询会更容易。
此外,我确信我能够在互联网上找到有同样问题的其他人。您会在谷歌上使用什么查询来回答我的问题?
答案 0 :(得分:4)
我想这应该可以解决问题:
SELECT DISTINCT name
FROM fruits
WHERE fruit = 'likedFruit'
AND name NOT IN (
SELECT name
FROM fruits
WHERE fruit = 'hatedFruit');
从内部更好地阅读此查询:
NOT IN
嵌套查询)你收集所有不喜欢某些特定水果的人的名字(让我们称之为“水果仇恨者”)我们必须使用嵌套查询或在此处加入,因为单行没有关于某人最喜欢的水果的所有信息。实际上,在这种特殊情况下不需要DISTINCT
- 但如果(name, fruit)
组合不是UNIQUE
,则会很有用。
这是 SQL Fiddle 。这里有很多a helpful article比较(性能方面)实现相同结果的几种方法。
答案 1 :(得分:0)
您也可以尝试以下查询。
SELECT Name FROM(SELECT Name,GROUP_CONCAT(Fruit)as Fruits FROM 表GROUP BY名称)t1其中Fruit不喜欢'%HatedFruit%';