MySQL-WHERE中的GROUP_CONCAT |小于或大于值

时间:2018-10-20 22:54:02

标签: mysql

我有以下查询,该查询可以满足我的要求,并显示从出生日期开始转换的人的年龄。但是我现在想通过说大于或小于这些年龄来缩小我的结果,但我不确定该怎么做。

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 | ages  |  
|--------|-------|
|  1     | 32,31 |  
| 26     | 75    |  
| 30     | 36    |  
| 50     | 35,50 |  
|________|_______|

如果我将年龄> 30和年龄<40纳入查询中,我希望看到以下结果:

|user_id | ages  |  
|--------|-------|
|  1     | 32,31 |  
| 30     | 36    |  
|________|_______|

希望这很有道理。

1 个答案:

答案 0 :(得分:1)

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

尝试以下查询:

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