我正在开发一个搜索功能,用于产品搜索。
但是当我尝试使用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

10-01 19:07
查看更多