我有以下查询:
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 :(得分:0)
由于您对最终结果(tags
)进行过滤,因此不太可能使用更有效的语句。声明的变化是可能的,您可以测试它们以确定它们是否更有效。
备注:在您
SELECT
中,*
没有任何GROUP BY
功能。这将导致*
值列表的随机返回,tags
值的重复长列表或根本没有分组(查询错误)。将函数应用于所有返回的列值,以便控制返回的值。
可能的替代查询:
首先选择所有具有%puzzle%
的game_idsSELECT 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
,因为它不会在结果中执行任何操作。