mysql - 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 | |________|________|
希望这是有道理的。
解决方案
- 首先,您不需要
LEFT JOIN
在您的情况下使用,因为您希望显式过滤两个表(about
和preferences
)中的列。一个简单的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
推荐阅读
- php - 调用未定义的方法 stdClass::isEmpty() 错误
- python - Python - 如何将两列中的值计算到每行中自己的列中?
- python - 冷却消息不适用于 discord.py
- android-jetpack-compose - mutableStateOf 值更改后不会触发 Recompose
- javascript - 如何使隐藏的显示再次出现
- c# - PreviewMouseLeftButtonDown 事件偶尔会在触摸控件外部时触发
- javascript - 每当我编译我的应用程序时,都会抛出一个反应错误,显示“TypeError:无法读取未定义的属性(读取'endOf')”
- java - 如何在 Java 中为 Web 套接字客户端(Jetty)设置最大缓冲区大小
- c - 为数组赋值:数组表达式必须是可修改的左值
- python - 错误: ffprobe/avprobe 和 ffmpeg/avconv 未找到。请安装一个