我有一个看似简单的问题。希望这不是一个骗子,我一直在搜索,但找不到任何特别相似的东西。
我有一个看起来像这样的表:
+------+----------+--------+--------+
| id | group_id | fruit | color |
|------+----------+--------+--------+
| 1 | 1 | apple | red |
| 2 | 1 | orange | orange |
| 3 | 1 | banana | yellow |
| 4 | 2 | kiwi | golden |
| 5 | 2 | banana | yellow |
| 6 | 3 | orange | orange |
| 7 | 3 | peach | orange |
| 8 | 3 | grape | red |
| 9 | 3 | apple | green |
| 10 | 3 | kiwi | brown |
+------+----------+--------+--------+
我只想检查每个组是否包含apple
水果,从而得到如下表:
+----------+------------+
| group_id | has_apple |
+----------+------------+
| 1 | true |
| 2 | false |
| 3 | true |
+----------+------------+
一段时间后,我设法获得该结果的唯一方法是通过以下查询:
SELECT group_id,
MAX(temp) AS has_apple
FROM
(SELECT group_id,
MAX(IF(fruit='apple',true,false)) OVER (PARTITION BY group_id) AS temp
FROM t)
GROUP BY group_id
好的,它可以工作...我希望它能很好地概括,以我的方式放置更复杂的原始查询。我的问题是:
是否有更好/更苗条/更容易的方法来获得相同的结果,也许只使用一个SELECT
?
答案 0 :(得分:4)
这是一种方法:
select group_id,
(countif( fruit = 'apple') > 0) as apple_flag
from t
group by group_id