2013-06-18 153 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