首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前几行和最后几行的MySQL群连接

问前几行和最后几行的MySQL群连接
EN

Stack Overflow用户
提问于 2014-02-20 01:46:37
回答 2查看 978关注 0票数 1

我有一个包含三列的MySQL表,如下所示:

代码语言:javascript
复制
    ID  Line    Text
    1001    1   Line 1 Text
    1001    2   Line 2 Text
    1001    3   Line 3 Text
    1001    4   Line 4 Text
    1001    5   Line 5 Text
    1001    6   Line 6 Text
    1002    1   Line 1 Text
    1002    2   Line 2 Text
    1002    3   Line 3 Text
    1002    4   Line 4 Text
    1002    5   Line 5 Text
    1002    6   Line 6 Text     
    1002    7   Line 7 Text

每个ID的最小行数可能不同(可能高达100行),但每个ID至少有6行。

我只想对每个ID的前3行和最后两行进行文本group_concat,如下所示:

代码语言:javascript
复制
    ID     Text
    1001    Line 1 Text Line 2 Text Line 3 Text Line 5 Text Line 6 Text
    1002    Line 1 Text Line 2 Text Line 3 Text Line 6 Text Line 7 Text

当我想对所有行执行group_concat时,我使用以下代码:

代码语言:javascript
复制
    SELECT ID, GROUP_CONCAT(Text SEPARATOR ' ') AS textConcat
    FROM table
    GROUP BY ID

如果我只想提取前3行,我可能会设置一个where条件如下:

代码语言:javascript
复制
    SELECT ID, GROUP_CONCAT(Text SEPARATOR ' ') AS textConcat
    FROM table
    WHERE Line <= 3
    GROUP BY ID

我也不知道最后两行怎么说。

有谁能帮我做一下MySQL查询吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 03:43:33

您可以通过连接两个组级联的结果来做到这一点:

代码语言:javascript
复制
SELECT ID,
       concat(substring_index(GROUP_CONCAT(Text SEPARATOR ' '), ' ', 3),
              substring_index(GROUP_CONCAT(Text SEPARATOR ' '), ' ', -2)
             ) as textConcat
FROM table
GROUP BY ID;

如果行很长,则它们确实有溢出group_concat()默认字符串大小的风险。

您还可以这样做:

代码语言:javascript
复制
select t.id, group_concat(t.line separator ' ' order by t.id) as lines
from table t join
     (select id, max(line) as numlines
      from table t
      group by id
     ) tl
     on t.id = tl.id
where t.line <= 3 or t.line > t.numlines - 2;
票数 3
EN

Stack Overflow用户

发布于 2014-02-20 02:38:03

  1. 取出前3行和最后2行;
  2. 用UNION将二者结合;
  3. 做一个文本的group_concat。

就像这样:

代码语言:javascript
复制
SELECT ID, GROUP_CONCAT(Text ORDER BY ID, Line SEPARATOR ' ') AS textConcat
FROM
(
    SELECT ID, Line, Text
    FROM table
    WHERE Line <= 3

UNION

    SELECT ID, Line, Text
    FROM table t1
    WHERE EXISTS (SELECT COUNT(*) FROM table t2 WHERE t1.ID = t2.ID AND t1.Line < t2.Line HAVING Count(*) < 2)
ORDER BY id, line
    ) TEMP
GROUP BY ID

SQL Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21896416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档