mysql group by并过滤每个分组记录中的值

时间:2011-01-25 12:10:16

标签: mysql

我有一个按年龄分组的用户表,但每个用户也有国籍,如果其中一个用户国籍是美国,我希望它在团体记录中有价值,目前似乎是第一个国籍发现,我该怎么写这个查询?

1 个答案:

答案 0 :(得分:0)

一种方法是:

SELECT *, IF(INSTR(GROUP_CONCAT('--', nationality, '--'), '--US--'),
             'US', nationality)
FROM table GROUP BY age;

这样做是因为GROUP_CONCAT结合了一个年龄段的所有国籍,如果在其中找到字符串“US”,则返回“US”,否则返回正常情况下的国籍。它还在国籍的开头和结尾加上“ - ”,使“美国”成为“ - 美国”。如果您不这样做,查询还会认为包含连续字符“US”的任何其他国籍都意味着美国。但那些' - '字符仅在内部使用,并未在最终结果中显示。


编辑:我想到了另一种(更干净但更长)的方式:

SELECT * FROM (SELECT * FROM table WHERE nation='US'
               UNION
               SELECT * FROM table WHERE nation!='US') AS tmp
GROUP BY age;

因此,首先选择国籍为美国的人,然后选择那些国籍不是美国的人并将这两组人合并,这样就可以得到一张人的表,其中第一批人来自美国,然后是其他人。然后对该表执行GROUP BY操作,如果在该年龄段中至少有一个来自美国的人,您将始终获得美国国籍,因为它始终是第一位的。