php
  • sql
  • 2014-12-31 150 views -2 likes 
    -2

    我試圖從2個表選擇項目,它應該返回2分的結果,但我正在逐漸超過1000:選擇,巨大的結果

    $sqlH = 'SELECT * FROM sheikh_tbl, wall'; 
    $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 
    

    謝謝你解釋我的查詢問題

    編輯:UNION ALL代替UNION

    The default behavior for UNION is that duplicate rows are removed from the result. The optional DISTINCT keyword has no effect other than the default because it also specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal does not occur and the result includes all matching rows from all the SELECT statements.

    +0

    什麼?你對我們有什麼期望? –

    +0

    您將首先使用OR語句。匹配結果將返回任何這些列。你可能想要使用而不是OR? – Hozikimaru

    +0

    您找回的1000個結果 - 它們是否有效? 您是否希望根據您的數據取回2個結果,或者您是否想限制結果只返回2個結果? – aashnisshah

    回答

    1

    Kritner提供了一個答案,我只是想澄清的理解:

    用逗號分隔的表列表已經過時連接語法,在沒有加入標準是用來過濾的加盟,你會得到一個交叉連接/笛卡爾乘積:

    表1:

    ID 
    1 
    2 
    3 
    

    表2:

    ID 
    4 
    5 
    6 
    

    所以這個查詢:

    SELECT * FROM Table1,Table2 
    

    返回:

    1,4 
    1,5 
    1,6 
    2,4 
    2,5 
    2,6 
    3,4 
    3,5 
    3,6 
    

    由於您WHERE標準是的OR語句列表,你有所有的記錄回因爲標準的至少一個匹配的每個記錄表。您可能需要使用正確的連接,或者如Kritner所示,使用兩個不相關的查詢來獲得一個結果集。

    +0

    好話......你說的話比Kritner更有趣! – Kritner

    +0

    (我覺得你的解釋是我想表達的,但你做得更好):) – Kritner

    1

    你缺少一個連接條件。如果沒有這一點,第一個表中的每一行都與第二個表中的每一行相關聯。

    假設兩個表有一個id列應符合:

    $sqlH = 'SELECT * FROM sheikh_tbl, wall'; 
    $sqlH .= ' WHERE sheikh_tbl.id = wall.id'; 
    $sqlH .= ' AND (shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%"))'; 
    

    或者更好的是,你應該使用更現代的明確join語法:

    $sqlH = 'SELECT * FROM sheikh_tbl'; 
    $sqlH .= ' JOIN wall ON sheikh_tbl.id = wall.id'; 
    $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 
    
    +0

    沒有加入,我想選擇兩個表中的項目,它們之間沒有任何關係 – Fred

    1

    你提的問題是非常令人迷惑..但基於評論這樣的事情可能會做雅:

    $sqlH = 'SELECT * FROM sheikh_tbl'; 
    $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 
    $sqlH .= 'UNION SELECT * FROM wall'; 
    $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 
    

    這是假設你的模式在兩個表之間是相同的,你的「,」意味着你聲稱不應該發生的連接。上面的查詢是相同的,只是由工會分開。可能有幫助,但是發佈你的模式以及爲什麼你期望2個結果會更有用。

    0

    我使用UNION上面的建議:

    $sqlH = 'SELECT shk_fname FROM sheikh_tbl'; 
    $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; 
    $sqlH .= ' UNION SELECT srub FROM wall'; 
    $sqlH .= ' WHERE rub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%"'; 
    

    所以他們2個查詢,結果是2(這是不對的,我添加了一個新的插入),如果我它們分開,我得到的結果是3(這是對的)

    相關問題