选择除其他行之外的行

时间:2015-09-24 18:38:56

标签: mysql sql

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的信息(我不明白他们是如何被选中的)。 当我选择独特的水果并放弃亚当购买的所有水果时,我就失去了吉米和卡罗尔买来的葡萄。

这不是我正在研究的实际表格。只是简化了我正在努力的事情。

有什么想法吗?

1 个答案:

答案 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

DEMO:http://sqlfiddle.com/#!9/3974d/3