2011-12-28 51 views
6

我有兩個表:的MySQL找到行通過另一臺

遊戲

`id`  INT(11) 

game_tags

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

game_tags.game = game.id

我可怕的MySQL,所以這裏是我的問題:我希望能夠找到什麼games有一定量的tag_id的。所以如果我有4個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 

我知道我(在我的心也不字呢等)解釋了這種可怕的,所以如果你有任何問題,只是發表評論。

+0

這是關係劃分問題。 – 2011-12-28 15:31:06

+1

檢查這個問題,超過10點的方式來實現你想要什麼:http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-a-has-many-through-relation – 2011-12-28 15:32:11

回答

4

您可以使用group byhaving條款與巴薩姆的查詢一起,以確保您已找到了所有四個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條款沒有這個信息。

+0

不幸的是,我們不會做這種方式,通過組會抱怨遊戲。*因爲列不在聚合函數中。只有在遊戲桌中有其他列的情況下,才需要在子選項 – 2011-12-28 13:25:59

+0

中完成。 OP表示遊戲桌只有1列:'id'。即便如此,我也不認爲mysql會抱怨這一點。但是,如果是這樣,你是正確的,則需要一個子選擇。 – 2011-12-28 14:29:55

+0

那麼,遊戲桌有10列,但我只發佈了一列,我認爲你需要這個查詢。 – Matt 2011-12-28 16:58:02

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 
+0

我不認爲這是相當正確的,因爲它會帶回包含任何四個指定標籤的條目,而OP要求**我希望能夠找到哪些遊戲將具有所有四個** – 2011-12-28 04:43:28

+0

謝謝,但作爲旁觀者說,我需要能夠找到什麼遊戲**所有四個** – Matt 2011-12-28 04:48:05

+0

@astander現在如何? – 2011-12-28 05:27:45

0

你可以做四個內部連接和添加四個地方條件像

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

這給你想要的東西。但可能有更好的表演方式

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); 
+0

如果'tag_id = 37011'會發生什麼? – 2011-12-28 15:29:37

相關問題