Mysql group_concat 限制分组中的行数

标签 mysql

下一个例子是我的数据库。

tb_port
id  port
1   80
2   22
3   53
4   3128
5   443
tb_dest
id  dest
1   network
2   local
tb_rule
id  id_port id_dest
1   1       1
2   2       1
3   3       1
4   4       1
5   5       1

选择: select dest,group_concat(port) from tb_port a, tb_dest b, tb_rule c where a.id=c.id_port and b.id=c.id_dest 按目标分组

结果: 网络 80,22,53,3128,443

但不是我要的结果,结果应该是这样。

选择例子: select dest,group_concat(port limit 2) from tb_port a, tb_dest b, tb_rule c where a.id=c.id_port and b.id=c.id_dest 按目标分组

我想要的结果

network    80,22
network 53,3128
network 443

如何只用SQL实现这个结果?

SQLfiddle:http://sqlfiddle.com/#!2/d11807

最佳答案

MySQL 并没有使这种查询变得简单,但一个(诚然不是很漂亮)解决方案是使用变量为每一行指定一个序列号,然后按行号整数除以 2 进行分组得到每组两个数字;

SELECT dest, GROUP_CONCAT(port ORDER BY rank) ports
FROM (
  SELECT dest, port, ( 
      CASE dest WHEN @curDest 
                THEN @curRow := @curRow + 1 
                ELSE @curRow := 1 AND @curDest := dest END) rank
  FROM tb_port a
  JOIN tb_rule c ON a.id = c.id_port
  JOIN tb_dest b ON b.id = c.id_dest, 
    (SELECT @curRow := 0, @curDest := '') r
  ORDER BY dest
) z
GROUP BY FLOOR(rank/2),dest
ORDER BY dest, MIN(rank)

An SQLfiddle to test with .

关于Mysql group_concat 限制分组中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28329520/

相关文章:

php - 使用类表继承从存储库中获取子类

php - 如何附加 MYSQL JSON

html - 从 Base64 到 HTML 的阿拉伯字符

php - 联合查询后如何更新?

mysql - SQL:连接两个表(LEFT OUTER JOIN)然后更新值

mysql - 使用不同的数据目录启动 MySQL 5.1

php - PHP 将 MySQL 数据库提取到表中时出现问题

mysql - 按星期几对 MySQL 数据进行分组

mysql - Node.js Express MySQL 检查是否成功

Mysql错误: too many connections error