MySQL найти строку через другую таблицу - PullRequest
6 голосов
/ 28 декабря 2011

У меня есть две таблицы:

game

`id`        INT(11)

game_tags

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

game_tags.game = 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 голосов
/ 28 декабря 2011

Вы можете использовать предложения group by и having вместе с запросом Бассама, чтобы убедиться, что вы нашли все четыре идентификатора для данной игры.

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 не имеет этой информации.

3 голосов
/ 28 декабря 2011
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
0 голосов
/ 28 декабря 2011

Да, это забавный подход. Неверный запрос. Но тоже можно сделать вот так. Просто для удовольствия!

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);
0 голосов
/ 28 декабря 2011

вы можете сделать четыре внутренних соединения и добавить четыре, где условие, такое как

t1.tag_id = 1 и t2.tag_id = 2 и ....

, дает вам то, что вы хотите.но может быть лучше исполнить путь

...