Mysql 合并多个子行

Mysql 合并多个子行,mysql,Mysql,提前谢谢你,我就是看不懂 我有两张桌子 类别 Id Name 1 Aptitude 2 English 身份证名称 1资质 2英语 标记 UserId CategoryId Mark 1 1 25 1 2 45 2 1 34 3 2 45 4 1 56 4 2 66

提前谢谢你,我就是看不懂

我有两张桌子

类别

Id Name 1 Aptitude 2 English 身份证名称 1资质 2英语 标记

UserId CategoryId Mark 1 1 25 1 2 45 2 1 34 3 2 45 4 1 56 4 2 66 用户ID类别ID标记 1 1 25 1 2 45 2 1 34 3 2 45 4 1 56 4 2 66 我希望输出的是一个mysql查询就是这样的

输出

UserId AptitudeMark EnglishMark 1 25 45 4 56 66 用户ID智能标记英语标记 1 25 45 4 56 66
因为我是mysql的新手,所以我只能得到一个类别或另一个类别,而且我不能把它们放在同一行。此外,当用户同时拥有类别标记时,我们应该考虑.

可以使用<代码> GROPYCONTAT < /COD>,但结果会有所不同。看看这个:

SELECT `UserId`, GROUP_CONCAT(`CategoryId`), GROUP_CONCAT(`Mark`) FROM `marks`
GROUP BY `UserID`

您可以使用
组\u CONCAT
,但结果会有所不同。看看这个:

SELECT `UserId`, GROUP_CONCAT(`CategoryId`), GROUP_CONCAT(`Mark`) FROM `marks`
GROUP BY `UserID`
请尝试此查询

SELECT UserId, GROUP_CONCAT(CategoryId,'-',Mark) AS Category_mark
FROM marks
GROUP BY UserId
这会给你这样的结果

UserId  Category_mark
  1      1-25,2-45,
请尝试此查询

SELECT UserId, GROUP_CONCAT(CategoryId,'-',Mark) AS Category_mark
FROM marks
GROUP BY UserId
这会给你这样的结果

UserId  Category_mark
  1      1-25,2-45,

如果
类别
(s)的数量是固定的,那么我们可以通过以下带有
CASE
表达式和
groupby
子句的查询来实现这一点

查询

select * from
(
    select UserId,
    max(case when CategoryId = 1 then Mark else null end) as AptitudeMark,
    max(case when CategoryId = 2 then Mark else null end) as EnglishMark
    from Mark
    group by UserId
)t
where t.AptitudeMark is not null
and t.EnglishMark is not null;

如果
类别
(s)的数量是固定的,那么我们可以通过以下带有
CASE
表达式和
groupby
子句的查询来实现这一点

查询

select * from
(
    select UserId,
    max(case when CategoryId = 1 then Mark else null end) as AptitudeMark,
    max(case when CategoryId = 2 then Mark else null end) as EnglishMark
    from Mark
    group by UserId
)t
where t.AptitudeMark is not null
and t.EnglishMark is not null;

如果类别未知,则需要使用动态sql进行查询,查询如下

set @sql = null;
select
  group_concat(distinct
    concat(
      'max(case when m.CategoryId = ''',
     m.CategoryId,
      ''' then m.Mark end) AS ',
      concat(c.Name,'Mark')
    )
  ) into @sql
from Mark m join Category c on c.Id = m.CategoryId ;

set @sql = concat('select m.UserId, ', @sql, ' from Mark m
                  join Category c on c.Id = m.CategoryId
                  group by m.UserId
');

prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
这是一个测试用例

mysql> select * from Category ;
+------+----------+
| Id   | Name     |
+------+----------+
|    1 | Aptitude |
|    2 | English  |
+------+----------+
2 rows in set (0.00 sec)

mysql> select * from Mark ;
+--------+------------+------+
| UserId | CategoryId | Mark |
+--------+------------+------+
|      1 |          1 |   25 |
|      1 |          2 |   45 |
|      2 |          1 |   34 |
|      3 |          2 |   45 |
|      4 |          1 |   56 |
|      4 |          2 |   66 |
+--------+------------+------+

6 rows in set (0.00 sec)
运行上面的查询将给出

+--------+--------------+-------------+
| UserId | AptitudeMark | EnglishMark |
+--------+--------------+-------------+
|      1 |           25 |          45 |
|      2 |           34 |        NULL |
|      3 |         NULL |          45 |
|      4 |           56 |          66 |
+--------+--------------+-------------+

如果类别未知,则需要使用动态sql进行查询,查询如下

set @sql = null;
select
  group_concat(distinct
    concat(
      'max(case when m.CategoryId = ''',
     m.CategoryId,
      ''' then m.Mark end) AS ',
      concat(c.Name,'Mark')
    )
  ) into @sql
from Mark m join Category c on c.Id = m.CategoryId ;

set @sql = concat('select m.UserId, ', @sql, ' from Mark m
                  join Category c on c.Id = m.CategoryId
                  group by m.UserId
');

prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
这是一个测试用例

mysql> select * from Category ;
+------+----------+
| Id   | Name     |
+------+----------+
|    1 | Aptitude |
|    2 | English  |
+------+----------+
2 rows in set (0.00 sec)

mysql> select * from Mark ;
+--------+------------+------+
| UserId | CategoryId | Mark |
+--------+------------+------+
|      1 |          1 |   25 |
|      1 |          2 |   45 |
|      2 |          1 |   34 |
|      3 |          2 |   45 |
|      4 |          1 |   56 |
|      4 |          2 |   66 |
+--------+------------+------+

6 rows in set (0.00 sec)
运行上面的查询将给出

+--------+--------------+-------------+
| UserId | AptitudeMark | EnglishMark |
+--------+--------------+-------------+
|      1 |           25 |          45 |
|      2 |           34 |        NULL |
|      3 |         NULL |          45 |
|      4 |           56 |          66 |
+--------+--------------+-------------+


你只有两个类别吗?@ArunKrish没有,它有很多。你只有两个类别吗?@ArunKrish没有,它有很多。这个查询给了我所有的用户。您能告诉我如何添加一个条件,在该条件下,只有对所有类别都有条目的用户才能在输出中。@SubashL您如何知道用户是否在所有类别中都有条目?如果您查看标记表,您将无法找到用户ID 2和3的所有类别。@SubashL您的数据库结构似乎是正确的,但是用这种方式实现它是不可能的,我想,我可以用PHP实现。这个查询给了我所有的用户praveen。您能告诉我如何添加一个条件,在该条件下,只有对所有类别都有条目的用户才能在输出中。@SubashL您如何知道用户是否在所有类别中都有条目?如果您查看标记表,您将无法找到用户ID 2和3的所有类别。@SubashL您的数据库结构似乎是正确的,但是,仅使用SQL是不可能实现的,我想,我可以使用PHP实现。请告诉我如何将category_mark列分离为单独的列,就像我的输出一样。请告诉我如何将category_mark列分离为单独的列,就像我的输出一样。此查询为所有用户提供了abhik。您能告诉我如何添加一个条件,在该条件下,只有对所有类别具有条目的用户才能在输出中。在这种情况下,只有userid 1和4@SubashL:只需给出获取
AptitudeMark
的条件,并且
EnglishMark
不是空的@ull,因为当您不知道将有多少类别时,它比空的多。如果只有两个类别,添加一个NOTNULL就可以了。这个查询给了我所有的用户abhik。您能告诉我如何添加一个条件,在该条件下,只有对所有类别具有条目的用户才能在输出中。在这种情况下,只有userid 1和4@SubashL:只需给出获取
AptitudeMark
的条件,并且
EnglishMark
不是空的@ull,因为当您不知道将有多少类别时,它比空的多。如果只有两个类别,添加一个NOTNULL就可以了。