Php MySQL普通查询与连接查询不同的结果

Php MySQL普通查询与连接查询不同的结果,php,mysql,sql,join,Php,Mysql,Sql,Join,我正在开发一个用于产品搜索的搜索功能 但是当我尝试使用MySQL连接时,它会给出不同的结果 tbl_产品表中有一个产品的sku编号为pd_art42504 所以当我使用42504搜索时,它应该给出一个结果 当我使用普通查询时,它给出1个结果 SELECT * FROM tbl_product, tbl_suggetions WHERE ( (tbl_product.pd_name LIKE '%42504%') OR (tbl_product.pd_art LIKE '%425

我正在开发一个用于产品搜索的搜索功能

但是当我尝试使用MySQL连接时,它会给出不同的结果

tbl_产品表中有一个产品的sku编号为pd_art42504

所以当我使用42504搜索时,它应该给出一个结果

当我使用普通查询时,它给出1个结果

SELECT *
FROM tbl_product, tbl_suggetions 
WHERE
(
    (tbl_product.pd_name LIKE '%42504%') OR
    (tbl_product.pd_art LIKE '%42504%') OR
    (tbl_product.pd_srkw LIKE '%42504%') OR
    (tbl_suggetions.sgtexts LIKE '%42504%' AND 
     tbl_product.pd_id = tbl_suggetions.sgproduct)
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 
选择*
来自tbl_产品,tbl_建议
哪里
(
(tbl_product.pd_名称,如“%42504%”)或
(tbl_product.pd_艺术,如“%42504%”)或
(tbl_product.pd_srkw,如“%42504%”)或
(tbl_suggetions.sg类似于“%42504%”的文本和
tbl_product.pd_id=tbl_suggetions.sgproduct)
)和pd_bestsell 1
按pd_id分组
兰德订单()
但是当使用连接时,它不会给出该产品作为结果

SELECT *
FROM tbl_product tbl_product 
JOIN tbl_suggetions tbl_suggetions 
    ON tbl_suggetions.sgproduct = tbl_product.pd_id 
WHERE
(
    (tbl_product.pd_name LIKE '%42504%') OR
    (tbl_product.pd_art LIKE '%42504%') OR
    (tbl_product.pd_srkw LIKE '%42504%') OR
    (tbl_suggetions.sgtexts LIKE '%42504%')
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 
选择*
来自tbl_产品tbl_产品
加入tbl_建议tbl_建议
在tbl_suggetions.sgproduct=tbl_product.pd_id上
哪里
(
(tbl_product.pd_名称,如“%42504%”)或
(tbl_product.pd_艺术,如“%42504%”)或
(tbl_product.pd_srkw,如“%42504%”)或
(tbl_suggetions.sgtext,如“%42504%”)
)和pd_bestsell 1
按pd_id分组
兰德订单()

有谁能帮我解决这个问题吗?我真的需要使用joinquery,因为它比正常的查询执行快20倍。非常感谢在您的第一次查询中,a记录将保留在结果集中,即使在以下条件下联接不匹配:

tbl_product.pd_name LIKE '%42504%' OR
tbl_product.pd_art LIKE '%42504%' OR
tbl_product.pd_srkw LIKE '%42504%'
我相信,当您切换到
内部联接
(您的第二次查询)时,包含sku编号
pd_art 42504
的记录会被过滤掉,因为它没有任何建议。保留此记录的一个选项(正如@James在我发布之前提到的)是
将两个表左连接在一起:

SELECT *
FROM tbl_product tbl_product 
LEFT JOIN tbl_suggetions tbl_suggetions 
    ON tbl_suggetions.sgproduct = tbl_product.pd_id 
WHERE
(
    tbl_product.pd_name LIKE '%42504%' OR
    tbl_product.pd_art LIKE '%42504%' OR
    tbl_product.pd_srkw LIKE '%42504%' OR
    tbl_suggetions.sgtexts LIKE '%42504%'
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND()
选择*
来自tbl_产品tbl_产品
左连接tbl_建议tbl_建议
在tbl_suggetions.sgproduct=tbl_product.pd_id上
哪里
(
tbl_product.pd_名称,如“%42504%”或
tbl_product.pd_艺术,如“%42504%”或
tbl_product.pd_srkw,如“%42504%”或
tbl_suggetions.sgtext,如“%42504%”
)和pd_bestsell 1
按pd_id分组
兰德订单()

如果这个假设是正确的,那么对于匹配记录,
tbl\u suggetions
表中的所有列都应该是
NULL

您的正常查询转换为join。应该是这样的

SELECT * FROM tbl_product tbl_product 
JOIN tbl_suggetions tbl_suggetions 
ON tbl_suggetions.sgproduct=tbl_product.pd_id AND tbl_suggetions.sgtexts LIKE '%42504%'
WHERE ( (tbl_product.pd_name LIKE '%42504%') 
OR (tbl_product.pd_art LIKE '%42504%') 
OR (tbl_product.pd_srkw LIKE '%42504%')) 
AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND()
从tbl\U产品中选择*tbl\U产品
加入tbl_建议tbl_建议
在tbl_suggetions.sgproduct=tbl_product.pd_id和tbl_suggetions.sgtext上,如“%42504%”
其中((tbl_product.pd_名称,如“%42504%”)
或(tbl_product.pd_艺术,如“%42504%”)
或(tbl_product.pd_srkw,如“%42504%”)
和pd_bestsell 1
按pd_id分组
兰德订单()

您正在执行两个非常不同的联接(不同的结果)。您想要哪一个联接的结果?(我猜第二个查询是正确的。)尝试左连接。它将显示结果,包括第二张桌子上不匹配的结果。这可能是连接对特定的pd不起作用_art@jarlh我需要1个结果,first queryI给出的正确结果我不确定这是否会影响性能。我认为它将具有与内部联接相同的性能,因为从技术上讲,它将读取相同数量的行,唯一的区别是它可能返回更多的行。在这一点上我可能是错的,我不能说我遇到过左连接比普通连接花费更长时间的情况。提高表性能的一种方法是索引表中的列。索引将使您的join更快,where子句也更快。这里有一篇关于索引的文章,可能值得一看。我使用了左连接,但执行查询大约需要6-10秒。但是当使用join时,它只需要不到1秒的时间。@SunethKalhara当您
左join
时,您必须扫描整个左表,而在
内部join
中,记录可以被丢弃。无论如何,更大的问题可能是没有在联接列上设置索引。你创建了索引吗?你是说索引:)在我为pd_id和sgproduct列编制索引后,它运行得很快,非常感谢,祝你好运!