2016-04-04 18 views
0

タグ付けシステムを使用してアイテムをグループ化しています。基本的には、アイテムに特定のタグを追加して、そのタグの一部またはすべてを含む他のアイテムをデータベースから検索し、各アイテムの最大タグ数で結果を並べることで、それに類似するアイテムを見つけることができます。ここにいくつかの疑似コードがあります:他の商品を検索して関連商品を検索します。同じタグの

product: id, name, description 
    tags: id, name 
    product_tags: id, product_id, tag_id 


    map = new Map<int product_id, int occurances> 
    loop product_tags.where(tag_id: [1,2,3]) as |ptag| 
     map[ptag.product_id]++ 
    end 
    sort map by max occurrences 
    return map.top(6) 

私の質問は次のとおりです。このタスクを実行するための単一のmysqlクエリを作成するにはどうすればよいですか?私はこれを達成する別の方法にもオープンしています。

+0

こんにちはとスタックオーバーフローを歓迎する:あなたが製品を必要とする場合

product_ids = ProductTag .joins("INNER JOIN product ON products.id = product_tags.product_id") .where("tag_id IN (?)", [1,2,3]) .select("product_id, count(product_id) as product_count") .group("product_id") .order("product_count DESC") .limit(6) .map(&:product_id) 

その後、あなたはこのような何かを行うことができます。ここでは、まず自分でそれを行って、何が起こるかを見てみましょう。多分あなたは既に持っています。さまざまなSQLクエリを試したときに何が起こったのですか?なぜあなたは結果に満足していませんでしたか?なぜあなたは既にやっていることを知っているすべての部分をやって始めてから、やっかいな部分に行きましょう...あなたが立ち往生している部分で私たちに戻ってきてください。どのような結果が得られ、代わりにあなたが期待しているものと比較しているのですか? –

+0

私は今どのようにそれをやっているかを示す疑似コードを提供しました。私の方法は非常に効率的ではありませんが、データベースではなくサーバー上でソートを行うためです。 – user3642563

+0

擬似コードで実際のエラーをデバッグするのは本当に難しいことです...コードの記述をデバッグしようとするようなものです。実際にSQLを試したことがあるなら、ここにSQLを含めてください(あなたの質問を編集し、コメントの書式がひどいので追加してください)。その後、私たちはあなたを助けるために始めることができます:) –

答えて

0

商品IDはありますか?

私はこのようなものとなるだろう:

Product.find(product_ids) 
+0

ありがとう!私はそれを試して、あなたに戻ってきます。 – user3642563

+0

働いているようです、ありがとう! – user3642563

関連する問題