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 |
当我收集GROUP BY水果时,我会丢失有关who和days_ago的信息(我不明白他们是如何被选中的)。 当我选择独特的水果并放弃亚当购买的所有水果时,我就失去了吉米和卡罗尔买来的葡萄。
这不是我正在研究的实际表格。只是简化了我正在努力的事情。
有什么想法吗?
答案 0 :(得分:1)
如果你想要亚当没有购买的水果,你可以使用子查询。让子查询选择他做购买的水果,然后让主要查询说出"而不是那些"。
SELECT *
FROM fruits
WHERE fruit NOT IN(
SELECT fruit
FROM fruits
WHERE who = "Adam"
)
DEMO: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