通过获取所有表结果对每行进行分组

Posted

技术标签:

【中文标题】通过获取所有表结果对每行进行分组【英文标题】:Group concat per row by getting all table results 【发布时间】:2013-10-01 12:25:56 【问题描述】:

对于我的搜索索引,我需要创建一个 sql 来获取 serval 表结果。

例如,我有以下表格;

标签(在这张表中我得到了所有标签) video_tags(在此表中,我得到与标签 id 相关的 video_id) 视频(所有视频)

当我想获取带有标签的电影时,我使用以下查询;

SELECT 
  videos.id,
  videos.id AS video_id,
  videos.video_title AS video_title,
  Group_Concat(DISTINCT t.tag_name SEPARATOR '|') AS tag_names 
FROM videos
JOIN video_tags AS vt ON vt.video_id = videos.id 
JOIN tags AS t ON t.tag_id = vt.tag_id 
WHERE videos.id = '10'

这对我来说很完美。

现在我需要通过这样的方式从表中获取所有结果;

SELECT 
  videos.id,
  videos.id AS video_id,
  videos.video_title AS video_title,
  Group_Concat(DISTINCT t.tag_name SEPARATOR '|') AS tag_names 
FROM videos
JOIN video_tags AS vt ON vt.video_id = videos.id 
JOIN tags AS t ON t.tag_id = vt.tag_id 
WHERE videos.id <=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )

我在这里面临的问题是我如何使用 group_concat 函数。它结合了所有行 成一行(我能理解)。我的问题是,如何使用 group_concat 函数将所有标记结果放入单个字段但 PER 行。

例如现在出结果

id | video_id | video_title | tag_names
 1       1      title of id1   all tag_names from tags

我想要什么

 id | video_id | video_title | tag_names
 1       1      title of id1   tags fort this row 
 2       2      title of id2   tags fort this row

【问题讨论】:

【参考方案1】:
SELECT videos.id,
       videos.id AS video_id,
       videos.video_title AS video_title,
       GROUP_CONCAT(DISTINCT t.tag_name SEPARATOR '|') AS tag_names 
FROM   videos
JOIN   video_tags AS vt
ON     vt.video_id = videos.id 
JOIN   tags AS t
ON     t.tag_id = vt.tag_id 
WHERE  videos.id <=
       (
       SELECT  max_doc_id
       FROM    sph_counter
       WHERE   counter_id = 1
       )
GROUP BY
       videos.id

【讨论】:

完美!该组当然 :) 非常感谢,我会接受的时候会接受

以上是关于通过获取所有表结果对每行进行分组的主要内容,如果未能解决你的问题,请参考以下文章

通过对它们进行分组来获取重复的 Id

按日期对 PHAsset 获取结果进行分组的智能方法

如何通过 LINQ to Sql 结果上的数据对分组进行 lambda?

数据库查询: 列出表的所有字段,“*”符号,查询指定字段数据,DISTINCT查询,IN查询,BETWEEN AND查询,LIKE模糊查询,对查询结果排序,分组查询,统计分组查询

如何从单个表中对多行进行分组并获取给定范围内的所有记录

SQL对查询结果进行分组