ID | fruit | who | days_ago |
----------------------------------
1 | orange | Adam | 2 |
2 | banana | Adam | 3 |
3 | apple | Adam | 4 |
4 | kiwi | Adam | 2 |
6 | banana | Jimmy | 3 |
7 | apple | Jimmy | 5 |
8 | grapes | Jimmy | 1 |
9 | orange | Carol | 2 |
10 | grapes | Carol | 6 |
11 | lemon | Carol | 3 |
我的问题是:
这张表包含了谁买了什么水果和什么时候买的信息(什么时候是我需要保留的额外信息)。
我要挑选亚当没有买的水果。
ID | fruit | who | days_ago |
----------------------------------
8 | grapes | Jimmy | 1 |
10 | grapes | Carol | 6 |
11 | lemon | Carol | 3 |
如果吉米买了,我不想知道卡罗尔也买了。
我的结果应该是:
ID | fruit | who | days_ago |
----------------------------------
8 | grapes | Jimmy | 1 |
11 | lemon | Carol | 3 |
当我按水果分组时,我会丢失关于谁和几天前的信息(我不明白他们是如何被选中的)。
当我挑选出独特的水果,把亚当买的全部都扔掉时,我失去了吉米和卡罗尔买的葡萄。
这不是我正在做的真正的桌子。只是简单化了我现在的处境。
有什么想法吗?
最佳答案
如果你想要亚当没有买的水果,你可以使用子查询。让子查询选择他买的水果,然后让主查询说“不是那些”。
SELECT *
FROM fruits
WHERE fruit NOT IN(
SELECT fruit
FROM fruits
WHERE who = "Adam"
)
演示:http://sqlfiddle.com/#!9/3974d/1
使用
GROUP BY
时,将多行合并为一行。其他行的数据没有消失,只是被隐藏了。尝试使用GROUP_CONCAT
查看who
字段的列表。SELECT ID, fruit,
GROUP_CONCAT(who) as who,
GROUP_CONCAT(days_ago) AS days_ago
FROM fruits
WHERE fruit NOT IN(
SELECT fruit
FROM fruits
WHERE who = "Adam"
)
GROUP BY fruit
演示:http://sqlfiddle.com/#!9/3974d/3