php
  • sql
  • 2014-12-31 200 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(这是对的)

    相关问题