MySQL group by包含

时间:2015-12-31 18:10:20

标签: mysql group-by

我有以下查询:

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%';

1 个答案:

答案 0 :(得分:0)

由于您对最终结果(tags)进行过滤,因此不太可能使用更有效的语句。声明的变化是可能的,您可以测试它们以确定它们是否更有效。

  

备注:在您SELECT中,*没有任何GROUP BY功能。这将导致*值列表的随机返回,tags值的重复长列表或根本没有分组(查询错误)。将函数应用于所有返回的列值,以便控制返回的值。

可能的替代查询:

首先选择所有具有%puzzle%

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

加入游戏以获取所有game_id,其中game_id具有%puzzle%和其他值:

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,因为它不会在结果中执行任何操作。