我正在尝试使用MySql进行分面搜索。
我有两张桌子:
附件:
id product_id price
1 6000001 24.99
2 6000002 20.99
3 6000003 22.99
4 6000004 25.99
5 6000005 29.99
标记:
id tagname tagid tagvalue product_id
1 Brand 6000008 Apple 6000001
2 Colour 6000009 Green 6000001
3 Brand 6000008 Sony 6000003
4 Brand 6000008 Sharp 6000021
5 Brand 6000008 Panasonic 6000022
6 Brand 6000008 Onkyo 6000027
目前我正在运行以下查询以选择产品列表:
SELECT
tags.tagname,
tags.tagid,
tags.tagvalue,
accessories.*
FROM accessories
Left Join tags ON tags.product_id = accessories.product_id
WHERE tags.tagid = '6000008'
连接提供包含6条记录的记录集。
要填充搜索的各个方面,我还需要[tags.product_id]和[tags.product_id]匹配的[tags.tagvalues]列表,并保留上述查询。
所以我需要返回“Apple”和“Green”以及6条记录。
我可以为每个product_id启动查询,但这似乎是一种非常缺乏的方法。也许我的方法需要重新思考。
答案 0 :(得分:1)
如果我理解正确,您需要标签与tags.tagid = '6000008'
匹配的产品的所有标签。从逻辑上讲,你可以这样做:
SELECT tags.tagname, tags.tagid, tags.tagvalue, accessories.*
FROM accessories left join
tags
ON tags.product_id = accessories.product_id
WHERE accessories.product_id in (select product_id
from tags
where tags.tagid = '6000008'
)
早期版本的MySQL存在in
和子查询的性能问题。您可以将其重写为join
:
SELECT tags.tagname, tags.tagid, tags.tagvalue, accessories.*
FROM accessories left join
tags
ON tags.product_id = accessories.product_id join
(select distinct product_id
from tags
where tags.tagid = '6000008'
) Filter
on accesories.Product_id = Filter.Product_id