如何解决在MySQL中加入表的转置
标题并不太合理,但这是我的表格结构
users table
+---------+
| user_id |
+---------+
| 1 |
| 2 |
| 3 |
+---------+
kids table
+----------+---------+------------+
| child_id | user_id | child_name |
+----------+---------+------------+
| 1 | 1 | child_a |
| 2 | 1 | child_b |
| 3 | 2 | child_c |
| 4 | 3 | child_x |
| 5 | 3 | child_y |
| 6 | 3 | child_z |
+----------+---------+------------+
现在,我想转置kids
表并将其与users
表联接。
预期输出。
+---------+---------+---------+---------+
| user_id | child_1 | child_2 | child_3 |
+---------+---------+---------+---------+
| 1 | child_a | child_b | |
| 2 | child_c | | |
| 3 | child_x | child_y | child_z |
+---------+---------+---------+---------+
如您所见,由于用户的最大子代数为3,因此子信息栏共有3列。
到目前为止,我可以做的是以下操作,但是随后我将不得不接触其他一些语言来再次格式化此数据。
select user_id,group_concat(child_name) from kids group by user_id;
任何想法我都可以在mysql中获取预期结果吗?
编辑:我知道每个用户最多可以有3个孩子。
解决方法
@Shobi,我相信您可以通过将kids
与users
多次连接来做到这一点,这应该给您孩子的名字,例如:
SELECT `u`.`user_id`,`k`.`child_name` AS `child_1`,`k2`.`child_name` AS `child_2`,`k3`.`child_name` AS `child_3`
FROM `users` AS `u`
LEFT JOIN `kids` AS `k` ON `k`.`user_id` = `u`.`user_id`
LEFT JOIN `kids` AS `k2` ON `k2`.`user_id` = `u`.`user_id`
AND `k2`.`child_id` <> `k`.`child_id`
LEFT JOIN `kids` AS `k3` ON `k3`.`user_id` = `u`.`user_id`
AND `k3`.`child_id` <> `k2`.`child_id`
AND `k3`.`child_id` <> `k`.`child_id`
GROUP BY `u`.`user_id`
Here is a working example on sqlfiddle.
注意:上面的查询在MySQL = 5.7中获得相同的结果,可以使用包含ANY_VALUE()
的查询版本,该版本被列为适当的用法here in the MySQL documentation.
SELECT `u`.`user_id`,ANY_VALUE(`k`.`child_name`) AS `child_1`,ANY_VALUE(`k2`.`child_name`) AS `child_2`,ANY_VALUE(`k3`.`child_name`) AS `child_3`
FROM `users` AS `u`
LEFT JOIN `kids` AS `k` ON `k`.`user_id` = `u`.`user_id`
LEFT JOIN `kids` AS `k2` ON `k2`.`user_id` = `u`.`user_id`
AND `k2`.`child_id` <> `k`.`child_id`
LEFT JOIN `kids` AS `k3` ON `k3`.`user_id` = `u`.`user_id`
AND `k3`.`child_id` <> `k2`.`child_id`
AND `k3`.`child_id` <> `k`.`child_id`
GROUP BY `u`.`user_id`
ORDER BY `u`.`user_id`
Here is a working example of this other version of the query in db-fiddle.
,您的意思是透视表,不需要users
表,可以尝试使用GROUP_CONCAT()
这样的解析函数来动态执行以下方法,该方法包括ROW_NUMBER()
函数: / p>
SET @sql = NULL;
SELECT GROUP_CONCAT(
DISTINCT
CONCAT(
'MAX(CASE WHEN rn =',rn,' THEN child_name END) AS child_',rn
)
)
INTO @sql
FROM
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY child_id) AS rn
FROM kids
) k;
SET @sql = CONCAT('SELECT user_id,',@sql,' FROM
(
SELECT *,ROW_NUMBER() OVER
(PARTITION BY user_id ORDER BY child_id) AS rn
FROM kids
) k
GROUP BY user_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。