2

MySql を使用してファセット検索を試しています。

私は2つのテーブルを持っています:

付属品:

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 に答える