【问题标题】:select with MD5 + CONCAT using where使用 MD5 + CONCAT 选择 where
【发布时间】:2013-11-12 17:40:29
【问题描述】:

哪里有问题? 选择工作正常..签入时 - 给出错误 'where 子句'中的未知列 'confirm'

 SELECT 
    users_id, MD5(CONCAT(users_pass, users_email)) AS confirm
FROM
    (users_items) 
WHERE users_active = 0 
    AND confirm = '39a5eccb97f63a2bb649ddd95c5a3ba7' 
LIMIT 1 

【问题讨论】:

  • “users_items”表中是否有“确认”列?如果是这样,请尝试用反引号括起来

标签: mysql md5 concat


【解决方案1】:

因为确认是alias

您不能在同一级别的查询中的where 子句中使用alias

你必须这样做

where xxx
and MD5(CONCAT(users_pass, users_email)) = '39a5eccb97f63a2bb649ddd95c5a3ba7'

或者,如 Vatev 所述,您可以在 HAVING 子句中使用别名。但是使用HAVING 子句可能会对性能产生影响。

原因是 where 过滤了您的查询(例如,尝试使用索引),而 HAVING 子句正在过滤这些过滤后的数据。

where xxx
HAVING confirm = '39a5eccb97f63a2bb649ddd95c5a3ba7'

【讨论】:

  • HAVING confirm = '39a5eccb97f63a2bb649ddd95c5a3ba7'
  • 是否可以在没有 GROUP BY 的情况下使用 HAVING?我认为不会。
  • @Bandydan 至少在 mysql 中,是的。
  • 正如文档中所说,“不要对应该在 WHERE 子句中的项目使用 HAVING”。我相信那些人,所以我不会:)
  • 是的。 WHERE MD5 最近查询。
【解决方案2】:
SELECT 
    users_id,
    MD5(CONCAT(users_pass, users_email)) AS confirm
FROM
    (users_items) 
WHERE
    users_active = 0 
    AND MD5(CONCAT(users_pass, users_email)) = '39a5eccb97f63a2bb649ddd95c5a3ba7'
LIMIT 1

对于HAVING子句,AFAIK,它只与GROUP BY一起使用。

添加:

“通常,使用的子句必须按照语法描述中显示的顺序给出。例如,HAVING 子句必须位于任何 GROUP BY 子句之后和任何 ORDER BY 子句之前。”

"不要对应该在 WHERE 子句中的项目使用 HAVING。例如,不要写以下内容:

SELECT col_name FROM tbl_name HAVING col_name > 0;

改为这样写:

SELECT col_name FROM tbl_name WHERE col_name > 0;"

这些是http://dev.mysql.com/doc/refman/5.0/en/select.html的引文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2011-06-18
    • 1970-01-01
    • 2011-09-27
    • 2017-03-17
    • 1970-01-01
    • 2020-12-30
    • 2013-09-27
    相关资源
    最近更新 更多