2016-03-30 10 views
0

私は1つのMySQLテーブルと、1つの'name'フィールドと7つのタグテキストフィールドの合計が(tag1, tag2, ...)です。タグで同様のレコードを探す

7つのタグフィールドのすべてを埋める必要はなく、一部のレコードには3つまたは4つのタグしかない場合があります。

タグはアルファベット順ではありません。

1つのレコードを選択し、同様のタグを持つ他の10個のレコードをリストする必要があります。同じ7つのタグ(ある場合)を持つレコードは、6つの同様のタグを持つレコードの前に表示されます。

多分、テーブルを分割する方が良いでしょうか?

+0

は、最初のレコードを選択する基準は何ですか?より良いサンプル入力出力。 – 1000111

+0

特定の問題を抱えているコードを投稿してください。あなたの宿題はできません。 –

答えて

0

これは、一致する順序ランクを製造するFIND_IN_SETを利用して達成することができます。あなたの本当のフィルタname'input_name'を置き換える、あなたの本当のテーブルの上に使用するためには

(select * from t1 where name = 'input_name') 
union all 
(select from t2.name, t2.tag1, t2.tag2, t2.tag3, t2.tag4, t2.tag5, t2.tag6, t2.tag7 
(
    select 
     *, 
     FIND_IN_SET(tag1, @tags) + FIND_IN_SET(tag2, @tags) + FIND_IN_SET(tag3, @tags) + FIND_IN_SET(tag4, @tags) + 
     FIND_IN_SET(tag5, @tags) + FIND_IN_SET(tag6, @tags) + FIND_IN_SET(tag7, @tags) AS cnt_tags 
    from t1 CROSS JOIN 
    (SELECT @tags := (select CONCAT_WS(',',tag1,tag2,tag3,tag4,tag5,tag6,tag7) 
         from t1 where name = 'input_name')) param 
) t2 
where name != 'input_name' 
order by cnt_tags desc 
limit 10) 

はこれを試してみてください。

関連する問題