作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下查询,它可以满足我的要求,并显示从出生日期转换而来的人们的年龄。但我现在想通过说大于或小于这些年龄来缩小结果范围,但我不知道该怎么做。
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 | |________|_______|
希望这是有道理的。
最佳答案
LEFT JOIN
,因为您希望显式过滤两个表中的列(about
和首选项
)。一个简单的 INNER JOIN
就足够了,而且效率更高。users.id
上查找分组的最小和最大年龄值。然后,我们可以使用 Having
子句来考虑 minimum 的情况。和 maximum年龄值在要求的范围内。尝试以下查询:
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
关于MySQL - GROUP_CONCAT 位于 WHERE |小于或大于值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52910752/
我是一名优秀的程序员,十分优秀!