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类别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 66Mysql 合并多个子行,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
因为我是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就可以了。