在WHERE子句中选择SELECT语句内部

时间:2012-07-22 20:09:38

标签: mysql

我不确定正确的技术措辞,请原谅我的头衔,但这就是问题所在。我有一个MySQL数据库,在用户表中我有* user_name *,a * password_salt *和一个md5 密码,其中包含密码然后是salt。在程序中,用户连接并且我得到一个要发送的查询以验证用户。 当用户连接时,我需要一种方法来选择他们的user_name,并将给定的密码与存储的密码进行比较,这需要在WHERE语句中的某处检索盐(我猜)。

这是我假设的“例子”:

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5((select password_salt FROM users where user_name='$nick')))) 
LIMIT 1

解决方案更新:得到了它的工作,感谢您的建议,正常的选择已经足够,问题是sql-auth api没有收到密码,除非指定了端口。

3 个答案:

答案 0 :(得分:1)

实际上你可以自由地使用“FROM”子句中声明的表中的任何列,不仅在“SELECT”子句中,而且在“WHERE”子句中,所以我在这里看不到需要子查询。简而言之:

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5(password_salt))) 
LIMIT 1

这样,只有在匹配两者时才选择行:   - 用户名是正确的   - 行中的密码匹配给定密码

我不确定我是否正确使用了md5()函数。我复制了你的例子。

答案 1 :(得分:0)

SELECT user_name 来自用户 WHERE user_name ='$ nick'AND       密码= md5(CONCAT('$ md5pass',password_salt)) 限制1

答案 2 :(得分:0)

请改为尝试:

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5(password_salt))) 
LIMIT 1