gpt4 book ai didi

MySQL - GROUP_CONCAT 位于 WHERE |小于或大于值

转载 作者:行者123 更新时间:2023-11-29 10:01:15 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com