2015-12-31 24 views
0

我有以下查詢:MySQL的組包含

select *, group_concat(tags.tag_name separator ',') as tags from games 
left join game_info using(game_id) 
left join game_tags using(game_id) 
left join tags on(tags.tag_id = game_tags.tag_id) 
group by games.game_id; 

有我的方式來篩選,其中的基團具有特定值的結果?

我可以添加具有,但是這似乎並不十分最佳:

select *, group_concat(tags.tag_name separator ',') as tags from games 
left join game_info using(game_id) 
left join game_tags using(game_id) 
left join tags on(tags.tag_id = game_tags.tag_id) 
group by games.game_id 
having tags like '%puzzle%'; 

回答

0

既然你對最終結果(tags)濾波器,更高效的說法是不容易。聲明的變化是可能的,你可以測試它們,看看它們是否更有效率。

備註:在你SELECT有一個*沒有任何GROUP BY功能。這將導致隨機返回一個*值列表,一長串tags值的重複列表或根本沒有分組(查詢錯誤)。將函數應用於所有返回的列值,以便控制返回的值。

另一種可能的查詢:

首先選擇所有這些確實有您%拼圖%

SELECT DISTINCT tag_id FROM tags WHERE tag_name LIKE '%puzzle%' 

加入遊戲上這回讓所有的game_ids其中game_id有%的game_ids拼圖%和其他值:

SELECT game_id,group_concat(tags.tag_name separator ',') as tags 
FROM games gs 
INNER JOIN game_tags gt ON gs.game_id=gt.game_id 
INNER JOIN (
    SELECT DISTINCT tag_id FROM tags WHERE tag_name LIKE '%puzzle%') q 
    ON gt.tag_id=q.tag_id 
GROUP BY gs.game_id; 

由於HAVING會已經過濾了任何不匹配的數據,可以使用INNER JOIN而不是LEFT JOIN,通常會加快查詢的速度。

使用*句話從上面的表格可以game_info從查詢中去除,因爲它不會做的結果什麼。