2016-03-30 8 views
1

私は次のテーブル構造を有する:のMySQL:彼らの共通のタグで一致するオブジェクト

pizza_tags 
    id 
    pizza_id 
    tag_id 

order_tags 
    id 
    order_id 
    tag_id 

-- 

tags 
    id 
    tag (text) 

各ピザだけでなく、順序は、複数のタグを持つことができます。

質問は、指定された注文(order_id)のための最良のピザを見つける方法です。ピザとオーダーが「一致する」タグが多いほど、特定のオーダーで見つかるピザの方が優れています。

私は交差点と結合でいくつかの異なるSQLクエリを試しましたが、説明された問題を解決する多かれ少なかれクイッククエリは見つかりませんでした。

お知らせください。

答えて

1

考え方は、tag_idの2つのタグテーブル間の結合です。残りは集計、フィルタリング、およびカウントです。

select ot.order_id, count(*) as NumMatching 
from order_tags ot join 
    pizza_tags pt 
    on ot.tag_id = pt.tag_id 
where pt.pizza_id = @PIZZA_ID 
group by ot.order_id 
order by NumMatching desc; 
1

質問を正しく理解している場合は、サブクエリを使用してこれを実行できます。このような何か:

SELECT o.id, o.order_id, o.tag_id, 
(SELECT COUNT(*) FROM pizza_tags AS p WHERE p.tag_id = o.tag_id) AS p_tags 
FROM order_tags AS o 
GROUP BY o.order_id, o.tag_id 
ORDER BY p_tags DESC; 

基本的に、あなたはあなたのorder_tags.tag_idと最も関連性の最初でそれらを並べ替えに一致するpizza_tagsを得ています。

私は最小のフィドルをまとめましたhere

関連する問題