2

我正在尝试使用 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 条记录的记录集。

为了填充搜索的各个方面,我还想要一个 [accessories.product_id] 和 [tags.product_id] 匹配的 [tags.tagvalues] 列表,并保留上述查询。

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

我可以对每个 product_id 进行查询,但这似乎是一种非常低效的方法。也许我的方法需要重新思考。

4

1 回答 1

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
于 2013-06-18T10:47:16.023 回答