我正在尝试从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
答案 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(对不对)