是否可以在另一个SELECT语句中使用SELECT语句的结果?

时间:2011-08-24 18:44:24

标签: php mysql select

这是我的代码,但我确定它不是正确的方法。

mysql_query("SELECT * FROM BlockUsers
WHERE OwnerID =
(SELECT ID FROM UserAccounts WHERE Code='$UserCode')
AND
BlockID =
(SELECT ID FROM UserAccounts WHERE Code='$BlockUserCode')
LIMIT 1", $DB)

有人可以帮忙吗?谢谢!

5 个答案:

答案 0 :(得分:5)

是的,但是当您进行类似的等式测试(=,<,>等等)时,子查询必须返回单个值。否则它将是somevalue = [list of result rows],这没有任何意义。

你想要:

SELECT * FROM BlockUsers
WHERE OwnerID IN (SELECT ID FROM UserAccounts WHERE.....)
              ^^--- use 'in' instead of '=';

答案 1 :(得分:3)

SELECT * FROM BlockUsers
WHERE OwnerID IN
(SELECT ID FROM UserAccounts WHERE Code='$UserCode')
AND
BlockID IN
(SELECT ID FROM UserAccounts WHERE Code='$BlockUserCode')
LIMIT 1

SELECT * FROM BlockUsers AS bu
INNER JOIN UserAccounts AS ua1 ON ua1.ID = bu.OwnerID
INNER JOIN UserAccounts AS ua2 ON ua2.ID = bu.BlockID
WHERE ua1.Code = '$UserCode' AND ua2.Code = '$BlockUserCode'
LIMIT 1

我想。我没有测试任何这个,但我很确定它很接近。

编辑: 我刚刚注意到你正在使用MySQL。你肯定想做内连接而不是子选择。在MySQL中,这些子选择将创建没有索引的派生表。在这些派生表中查找OwnerID和BlockID将对它们进行全表扫描。如果$ UserCode和$ BlockUserCode将子选择的结果缩小到单行,这可能无关紧要,但如果它们返回相当多的行,它将真正减慢您的查询速度。

答案 2 :(得分:2)

您可以只加入UserAccounts来获取所需的行,而不是使用子查询。

SELECT BlockUsers.* FROM BlockUsers
JOIN UserAccounts as UA1 ON Code='$UserCode' AND OwnerID = UA1.ID
JOIN UserAccounts as UA2 ON Code='$BlockUserCode' AND BlockID = UA2.ID
LIMIT 1

答案 3 :(得分:1)

是的你可以,子查询,你可以在这里找到官方的mysql参考:http://dev.mysql.com/doc/refman/5.0/en/subqueries.html 从你的查询中我认为你好,假设你的子查询只返回1个值,或者@Marc B点使用IN而不是等号。

答案 4 :(得分:0)

尝试使用

SELECT * FROM BlockUsers, UserAccounts
WHERE (OwnerID = ID and BlockID=ID and Code in ('$BlockUserCode', '$UserCode')
LIMIT 1