我写了一个查询,从出生日期开始,我计算出一个人的年龄,然后使用AS age
创建一个年龄字段。
我的问题是,是否有可能再次匹配该年龄段?
像这样,
SELECT `candidates`.`candidate_id`,
`candidates`.`first_name`,
`candidates`.`surname`,
`candidates`.`DOB`,
`candidates`.`gender`,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) AS `age`
FROM `candidates`
WHERE `age` <= 20
非常感谢任何帮助?
-----所以我把WHERE更改为HAVING,这是我的完整查询------
SELECT `candidates`.`candidate_id`,
`candidates`.`first_name`,
`candidates`.`surname`,
`candidates`.`DOB`,
`candidates`.`gender`,
`candidates`.`talent`,
`candidates`.`location`,
`candidates`.`availability`,
`candidate_assets`.`url`,
`candidate_assets`.`asset_size`
FROM `candidates`
LEFT JOIN `candidate_assets` ON `candidate_assets`.`candidates_candidate_id` = `C`.`candidate_id`
WHERE `C`.`availability` = 'yes'
AND C.talent = "actor"
AND C.skill = "accents"
AND C.gender = "male"
AND HAVING DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) <= 69
AND HAVING DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) <=19
AND HAVING DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) <=49
我收到以下错误,
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'HAVING DATE_FORMAT(NOW(),'%Y')附近使用正确的语法 - DATE_FORMAT(
candidates
。DOB
,'%Y') - (第15行的DATE_'
对于我的生活,我不知道它是什么。
答案 0 :(得分:2)
您可以尝试使用WHERE
替换HAVING
子句。但是,如果你这样做,MySQL将无法使用索引来优化结果集。
答案 1 :(得分:2)
一种方法是将原始查询包装为子查询,并将WHERE
子句移动到外部查询:
SELECT * FROM (
SELECT `candidates`.`candidate_id`, -- this is the original query
`candidates`.`first_name`,
`candidates`.`surname`,
`candidates`.`DOB`,
`candidates`.`gender`,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) AS `age`
FROM `candidates` ) as innertable
WHERE `age` <= 20 -- this is now part of the outer query
澄清:这可以在MySQL 5中运行
注意:这假定原始查询有效
答案 2 :(得分:1)
否强>
但是,别名字段可以在ORDER
子句中使用,也可以在其他字段中使用。但不是WHERE
。
答案 3 :(得分:1)
我知道你可以在SQL Server中执行此操作,但不确定是否可以在MySQL中使用。
select * from
(SELECT `candidates`.`candidate_id`,
`candidates`.`first_name`,
`candidates`.`surname`,
`candidates`.`DOB`,
`candidates`.`gender`,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) AS `age`
FROM `candidates`) as newTable
WHERE `age` <= 20
希望它有所帮助。
答案 4 :(得分:0)
要解决您转换为HAVING
的问题:
HAVING
是一个类似于WHERE
的子句,但在构造结果后应用。如果你回到第一个查询,它会看起来像这样(从第二个查询中借用WHERE
使其更清晰):
SELECT `candidates`.`candidate_id`,
`candidates`.`first_name`,
`candidates`.`surname`,
`candidates`.`DOB`,
`candidates`.`gender`,
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) AS `age`
FROM `candidates`
WHERE `C`.`availability` = 'yes'
AND C.talent = "actor"
AND C.skill = "accents"
AND C.gender = "male"
HAVING `age` <= 20