Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql group by并过滤每个分组记录中的值_Mysql - Fatal编程技术网

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

mysql group by并过滤每个分组记录中的值,mysql,Mysql,我有一个按年龄分组的用户列表,但每个用户也有一个国籍,如果其中一个用户的国籍是我们,我希望该值在组记录中,目前它似乎取它找到的第一个国籍,我如何编写此查询 一种方法是: SELECT *, IF(INSTR(GROUP_CONCAT('--', nationality, '--'), '--US--'), 'US', nationality) FROM table GROUP BY age; 它的作用是,GROUP_CONCAT将一个年龄段的所有国籍组合在一起,如果它

我有一个按年龄分组的用户列表,但每个用户也有一个国籍,如果其中一个用户的国籍是我们,我希望该值在组记录中,目前它似乎取它找到的第一个国籍,我如何编写此查询

一种方法是:

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;

因此,首先选择国籍为美国的人,然后选择国籍不是美国的人,并将这两组人组合起来,得到一张人员表,按顺序排列,首先是来自美国的人,然后是其他人。然后对该表执行分组操作,如果在该年龄段至少有一个人来自我们,您将始终获得我们的国籍,因为它将始终排在第一位。

并为我们添加where子句?抱歉,我起初不理解您的问题,但现在我理解了。所以我编辑了我的答案