6

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

ゲーム

`id`        INT(11)

ゲームタグ

`game`      INT(11)
`tag_id`    INT(11)

game_tags.game = game.id

私は MySQL がひどいので、ここに私の質問があります。games一定量の があるものを見つけられるようにしたいtag_idのです。したがって、 が 4 つtag_id(3、5、7、11) ある場合、テーブルを調べて、これら 4 つのタグすべてを持つゲームを見つけられるようにしたいと考えていgame_tagsます。これが私が意味することの例です:

疑似 MySQL:

SELECT *
FROM `games`
WHERE (search through game_tags table and find which rows have the same `game` field and all of the tag_id's that I need to search for)
LIMIT 0, 15

私はこの恐ろしいことを説明したことを知っています(私の頭の中でそれを言葉にすることができませんでした)ので、質問があればコメントを残してください.

4

4 に答える 4

4

group byandhaving節を Bassam のクエリと共に使用して、特定のゲームの 4 つの ID すべてを確実に見つけることができます。

select
    game.*
from game
    join game_tags on game.id = game_tags.game
where
    tag_id in (3, 5, 7, 11)
group by
    game.id
having 
    count(distinct tag_id) = 4;

havingこれは、集計の実行後に句が実行されるため機能することに注意してください。count(distinct ...)一方、where句にはこの情報がありません。

于 2011-12-28T05:20:37.940 に答える
3
SELECT games.*
FROM games
     INNER JOIN 
     (SELECT game, COUNT(DISTINCT tag_id) AS gameCnt
      FROM game_tags
      WHERE tag_id in (3, 5, 7, 11)
      GROUP BY game) t on games.id = game
WHERE gameCnt = 4
于 2011-12-28T04:40:44.817 に答える
0

4つの内部結合を実行し、次のような条件で4つ追加できます。

t1.tag_id=1およびt2.tag_id=2および...。

これはあなたが望むものをあなたに与えます。しかし、より良いパフォーマンスの方法があるかもしれません

于 2011-12-28T05:28:02.290 に答える
0

ええ、これは面白いアプローチです。クエリが正しくありません。しかし、このようにすることもできます。楽しみのためだけに!

SELECT game, BIT_OR(pow(2,tag_id)) AS tags 
FROM game_tags 
GROUP BY game 
HAVING tags = pow(2,3) + pow(2,5) + pow(2,7) + pow(2,11);
于 2011-12-28T05:53:23.963 に答える