MySQL多连接或嵌套SELECT查询?

时间:2013-06-18 10:38:27

标签: mysql faceted-search

我正在尝试使用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启动查询,但这似乎是一种非常缺乏的方法。也许我的方法需要重新思考。

1 个答案:

答案 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