3

によって順位表Iは、次のようになりますproducts idskeywordsのテーブルを持っている:MySQLの機能:最も類似した属性

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| product_id | int(10) unsigned | YES | MUL | NULL |    | 
| keyword | varchar(255)  | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

このテーブルには、単にこれらの製品に関連した製品ID、およびキーワードを格納します。だから、例えば、それが含まれる場合があります。つまり

+----+------------+---------+ 
| id | product_id | name | 
+----+------------+---------+ 
| 1 |   1 | soft | 
| 2 |   1 | red  | 
| 3 |   1 | leather | 
| 4 |   2 | cloth | 
| 5 |   2 | red  | 
| 6 |   2 | new  | 
| 7 |   3 | soft | 
| 8 |   3 | red  | 
| 9 |   4 | blue | 
+----+------------+---------+ 

を:

  • 製品1を、柔らかな赤、と革です。
  • 商品2は布、赤、新品です。
  • 製品3は赤色で柔らかい、
  • 製品4は青です。

は、私は、製品IDに取ると、共通キーワードの数によってランク付け製品IDのソートされたリストを取り戻すためにいくつかの方法が必要です

ですから、例えば、私はproduct_id 1に渡した場合、I

答えて

1

1つのオプションでは、条件付き集計を使用して自己間の外部結合を使用して、たとえば、一致する名前の数をカウントします。プロダクトID 1、および他のすべての製品ID:

SELECT t2.product_id, 
     SUM(CASE WHEN t1.name IS NOT NULL THEN 1 ELSE 0 END) AS matches 
FROM yourTable t1 
RIGHT JOIN yourTable t2 
    ON t1.name = t2.name AND 
     t1.product_id = 1 
WHERE t2.product_id <> 1 
GROUP BY t2.product_id 
ORDER BY t2.product_id 

実行するデモについては、以下のリンクをクリックしてください:

SQLFiddle

1

あなたはproductid 1ためkeywordsに対してouter joinを使用する必要があります。

select y.productid, count(y2.keyword) 
from yourtable y 
    left join (
    select keyword from yourtable y2 where y2.productid = 1 
    ) y2 on y.keyword = y2.keyword 
where y.productid <> 1 
group by y.productid 
order by 2 desc 

結果:

| productid | count(y2.keyword) | 
|-----------|-------------------| 
|   3 |     2 | 
|   2 |     1 | 
|   4 |     0 | 
関連する問題