我有以下查询,该查询可以满足我的要求,并显示从出生日期开始转换的人的年龄。但是我现在想通过说大于或小于这些年龄来缩小我的结果,但我不确定该怎么做。
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 | |________|_______|
希望这很有道理。
答案 0 :(得分:1)
LEFT JOIN
,因为您希望显式过滤两个表(about
和preferences
中的列)。一个简单的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