这是我的代码,但我确信这不是正确的方法。
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)
有人能帮帮忙吗?谢谢!
发布于 2011-08-24 18:48:09
是的,但当您进行这样的相等测试(=、<、>等)时,子查询必须返回单个值。否则它将是somevalue = [list of result rows]
,这没有任何意义。
你会想要:
SELECT * FROM BlockUsers
WHERE OwnerID IN (SELECT ID FROM UserAccounts WHERE.....)
^^--- use 'in' instead of '=';
发布于 2011-08-24 18:51:38
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将sub selects的结果缩小到一行,这可能无关紧要,但如果它们返回相当多的行,则会真正减慢查询速度。
发布于 2011-08-24 18:53:15
您可以不使用子查询,只需连接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
https://stackoverflow.com/questions/7180613
复制相似问题