MySQL正常查询vs Join查询不同的结果

时间:2016-09-08 09:30:59

标签: php mysql sql join

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

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

tbl_product 表中的商品的库号为 pd_art 42504.

所以当我使用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() 

但是当使用连接时,它不会将该产品作为结果

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() 

任何人都可以帮我解决这个问题,我真的需要使用连接查询,因为它比普通查询执行快20倍。非常感谢

2 个答案:

答案 0 :(得分:2)

在您的第一个查询中,即使连接在以下条件下匹配,a记录也会保留在结果集中:

tbl_product.pd_name LIKE '%42504%' OR
tbl_product.pd_art LIKE '%42504%' OR
tbl_product.pd_srkw LIKE '%42504%'

我相信当您切换到INNER JOIN(您的第二个查询)时,具有sku编号pd_art 42504的记录将被过滤掉,因为它没有任何建议。保留此记录的一个选项(正如@James在我发布之前提到的那样),将两个表格LEFT JOIN放在一起:

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_suggetions表中的所有列都应为NULL

答案 1 :(得分:0)

您的普通查询转换为加入。应该是这样的。

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()