我正在开发一个用于产品搜索的搜索功能。
但是当我尝试使用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倍。非常感谢
答案 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()