MySQL GROUP_CONCAT 位于另一个 GROUP_CONCAT 中

标签 mysql sql

有可能吗? 我想要得到的是这样的:

+-------------------------------+
| data 1 (another1, another2);  |
| data 2 (another1 ..... )      |
+-------------------------------+

从表中可以看到这样的内容:

--------------------------------+
data1 | another1 | foreign key1 |
--------------------------------+
data1 | another2 | foreign key1 |
--------------------------------+
data2 | another1 | foreign key1 |
--------------------------------+

我使用这个代码

GROUP_CONCAT(DISTINCT CONCAT(data, ' (',  another, ')') SEPARATOR ';\r\n ') as InOneCell

并得到这个输出:

+-------------------------------+
| data 1 (another1);            |
| data 1 (another2);            |
| data 2 (another1); ...        |
+-------------------------------+

尝试过这个:

GROUP_CONCAT(DISTINCT CONCAT(data, ' (',  GROUP_CONCAT(another SEPARATOR ', '), ')') SEPARATOR ';\r\n ') as InOneCell

并得到错误“组功能无效使用”,这真的很阴暗-_- 由于复杂的查询,我按 - 外键进行分组(下)。

我做错了什么或者仅在 SQL 上不可能?

这里是完整的查询:

SELECT  
s.name, 
s.surname, 
gr.number AS 'group', 
s.bitrh_date, 
s.email, 
s.registration_ip,
s.registration_time,
GROUP_CONCAT(DISTINCT CONCAT(dis.code, ' ', dis.title, ' (',  GROUP_CONCAT(DISTINCT g.mark SEPARATOR ', '), ')') SEPARATOR ';\r\n ') as learning,
ROUND(AVG(g.mark), 2) AS average,
gr.semester,
ref.text AS reference

FROM t_students s
LEFT JOIN t_grades g
    ON s.id = g.student
LEFT JOIN t_groups gr
    ON s.group_id = gr.id
LEFT JOIN t_references ref
    ON ref.author = s.id
LEFT JOIN t_program prog
    ON gr.id = prog.group_id
LEFT JOIN t_disciplines dis
    ON prog.discipline_id = dis.code
GROUP BY s.id
ORDER BY s.registration_time DESC

最佳答案

您应该使用group by(并且单个group_concat就足够了)

select CONCAT(data, ' (',  GROUP_CONCAT(another SEPARATOR ', '), ');') as InOneCell
from my_table  
group by data 

或者您可以使用子查询

select data, group_concat(my_group)
from (
  select data, group_concat(another) my_group 
  group by data
) t 
group by data 

就你的情况而言 您可以使用子查询,例如:

  SELECT  
  s.name, 
  s.surname, 
  gr.number AS 'group', 
  s.bitrh_date, 
  s.email, 
  s.registration_ip,
  s.registration_time,
  GROUP_CONCAT(DISTINCT CONCAT(dis.code, ' ', dis.title, ' (', t.learning, ')') SEPARATOR ';\r\n ') as learning,
  t.average,
  gr.semester,
  ref.text AS reference

  FROM t_students s
  LEFT JOIN (SELECT
    student, 
    GROUP_CONCAT(DISTINCT mark SEPARATOR ', ') learning,
    ROUND(AVG(mark), 2) AS average
    from t_grades
    group by student
    ) t on t.student = s.id
  LEFT JOIN t_groups gr
      ON s.group_id = gr.id
  LEFT JOIN t_references ref
      ON ref.author = s.id
  LEFT JOIN t_program prog
      ON gr.id = prog.group_id
  LEFT JOIN t_disciplines dis
      ON prog.discipline_id = dis.code

  GROUP BY s.id
  ORDER BY s.registration_time DESC

关于MySQL GROUP_CONCAT 位于另一个 GROUP_CONCAT 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234627/

相关文章:

php - 使用动态字段名称将数据保存在mysql中

mysql - 当我使用 union all 和 group by 时获取所有最后一个 id

mysql查询不同,性能不同

php - Laravel - 多主键

php - 在 MySQL 中创建半正矢公式

php - 在 MySQL 表中使用掩码

php - 有没有办法识别用sql语句选择了哪些数据

SQL Server 2012 - 自连接或 CTE 方面的帮助

self JOIN 的 SQL 性能

sql - 我可以通过 lib/pq Go SQL 驱动程序获得 EXPLAIN ANALYZE 输出吗?