首页 > 解决方案 > MySQL - GROUP_CONCAT 在 WHERE | 小于或大于值

问题描述

我有以下查询,它可以满足我的需求,并显示从出生日期转换而来的人的年龄。但我现在想通过说大于或小于那些年龄来缩小我的结果,但我不知道该怎么做。

SELECT
  u.`id` as `user_id`,
  GROUP_CONCAT(timestampdiff(year, a.`date_of_birth`, curdate()) separator ',') AS `ages`
FROM
  users u
LEFT JOIN preferences p ON u.`id` = p.`user_id`
LEFT JOIN about a ON u.`id` = a.`user_id`
WHERE
  u.`type` IN ('male','couple')
AND
  p.`couple` = 1
GROUP BY
  u.`id`;

因此,如果我的结果在哪里:

|user_id | 年龄 |  
|--------|--------|
| 1 | 32,31 |  
| 26 | 75 |  
| 30 | 36 |  
| 50 | 35,50 |  
|________|________|

如果我要在查询中包含年龄 > 30 和年龄 < 40,我希望看到以下结果:

|user_id | 年龄 |  
|--------|--------|
| 1 | 32,31 |  
| 30 | 36 |  
|________|________|

希望这是有道理的。

标签: mysql

解决方案


  • 首先,您不需要LEFT JOIN在您的情况下使用,因为您希望显式过滤两个表(aboutpreferences)中的列。一个简单的INNER JOIN就足够了,而且效率更高。
  • 现在,我们需要找到分组的最小和最大年龄值users.id。然后,我们可以使用Having子句来考虑最小最大年龄值在所需范围内的情况。

尝试以下查询:

SELECT
  u.`id` as `user_id`,
  GROUP_CONCAT(TIMESTAMPDIFF(YEAR, a.`date_of_birth`, CURDATE())) AS `ages`, 
  MIN(TIMESTAMPDIFF(YEAR, a.`date_of_birth`, CURDATE())) AS min_age, 
  MAX(TIMESTAMPDIFF(YEAR, a.`date_of_birth`, CURDATE())) AS max_age, 
FROM
  users u
JOIN preferences p ON u.`id` = p.`user_id`
JOIN about a ON u.`id` = a.`user_id`
WHERE
  u.`type` IN ('male','couple')
AND
  p.`couple` = 1
GROUP BY
  u.`id` 
HAVING 
  min_age > 30 AND 
  min_age < 40 AND 
  max_age > 30 AND 
  max_age < 40

推荐阅读