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

10-05 19:53