6

我有两张桌子:

游戏

`id`        INT(11)

游戏标签

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

game_tags.game =游戏.id

我对 MySQL 很不满意,所以这是我的问题:我希望能够找到games具有一定数量的tag_id's。因此,如果我有四个tag_id(3、5、7、11),我希望能够通过查看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 的查询一起使用,以确保您找到了给定游戏的所有四个 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

您可以进行四个内部连接并添加四个 where 条件,例如

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 回答