php
  • mysql
  • select
  • 2011-08-24 118 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 
    
    相關問題