2013-06-18 151 views
2

我正在试验使用MySql的分面搜索。MySQL多重连接或嵌套SELECT查询?

我有两个表:

配件:

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 

目前我运行follwing查询选择的产品列表:

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.tagvalues]列表,其中[accessories.product_id]和[tags.product_id]匹配,并保留上述查询。

所以我需要返回“Apple”和“Green”以及6条记录。

我可以为每个product_id启动查询,但这似乎是一种非常不方便的方法。也许我的方法需要重新思考。

回答

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