我正在开发一个搜索功能,用于产品搜索。
但是当我尝试使用MySQL join时,它会给出不同的结果。
tbl_product表中有一个产品的sku编号为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()
但是当使用join时,它不会将该产品作为结果
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倍。谢谢
最佳答案
在第一个查询中,即使在以下条件下联接不匹配,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在我发布之前提到的那样)是将两个表放在一起: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()
如果这个假设是正确的,那么对于匹配记录,
LEFT JOIN
表中的所有列都应该是tbl_suggetions
。