mysql AS子句

时间:2011-10-26 13:22:23

标签: mysql sql

我写了一个查询,从出生日期开始,我计算出一个人的年龄,然后使用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(candidatesDOB,'%Y') - (第15行的DATE_'

对于我的生活,我不知道它是什么。

5 个答案:

答案 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