从多个表中选择,结果巨大

时间:2014-12-31 16:34:06

标签: php sql

我正在尝试从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.

4 个答案:

答案 0 :(得分: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.'%")';

答案 1 :(得分: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个结果会更有用。

答案 2 :(得分: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建议的那样,UNION两个不相关的查询来获得一个结果集。

答案 3 :(得分: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(对不对)