MySQL通过另一个表找到行

时间:2011-12-28 04:35:38

标签: php mysql sql relational-division

我有两张桌子:

游戏

`id`        INT(11)

game_tags

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

game_tags.game = game.id

我对MySQL很恐怖,所以这是我的问题:我希望能够找到games具有一定数量tag_id的内容。因此,如果我有四个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 个答案:

答案 0 :(得分:4)

您可以使用group byhaving条款以及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子句没有此信息。

答案 1 :(得分: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

答案 2 :(得分:0)

你可以做四个内连接,并添加四个条件,如

t1.tag_id = 1和t2.tag_id = 2和....

这可以满足您的需求。但可能有更好的表现方式

答案 3 :(得分: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);