php
  • mysql
  • select
  • 2011-08-24 117 views 2 likes 
    2

    这是我的代码,但我确定它不是这样做的正确方法。是否可以使用另一个SELECT语句中的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) 
    

    有人可以帮忙吗?谢谢!

    +0

    这不行吗?这是一个有效的SQL查询。 –

    +0

    不,它没有提出错误,但在同一时间没有正确的结果。 – SReca

    +1

    感谢大家的帮助! :D – SReca

    回答

    5

    是的,但是当你做这样的平等测试(=,<,>等等)时,子查询必须返回一个值。否则它会是somevalue = [list of result rows],这没有任何意义。

    你会想:

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

    谢谢!这工作:D – SReca

    1

    当然可以,子查询,你可以在这里找到正式的MySQL参考:http://dev.mysql.com/doc/refman/5.0/en/subqueries.html 和您的查询,我认为你是好去假设你的子查询只返回1值,或@Marc B点使用IN而不是等号。

    0

    尝试使用

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

    您将需要加入'UserAccounts'两次,因为OP是请求2个不同的行。 –

    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

    而不是使用子查询,你可以加入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 
    
    相关问题