这是我的代码,但我确定它不是正确的方法。
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)
有人可以帮忙吗?谢谢!
答案 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