我正在尝试选择一对多关系的结果并将结果放在多列中。我的表看起来像:
表用户:
+----+----------+
| id | user |
+----+----------+
| 1 | jenny |
| 2 | chris |
| 3 | harry |
+----+----------+
表位:
+----+-------------+
| id | location |
+----+-------------+
| 1 | New York |
| 2 | Washington |
| 3 | Memphis |
| 4 | Dallas |
| 5 | Las Vegas |
+----+-------------+
表user_locations:
+----+---------+-------------+
| id | user_id | location_id |
+----+---------+-------------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 1 | 5 |
| 4 | 2 | 2 |
| 5 | 2 | 4 |
| 6 | 3 | 4 |
| 7 | 3 | 5 |
| 8 | 3 | 2 |
+----+---------+-------------+
我想要的结果是:
+---------+-------+------------+------------+------------+
| user_id | user | location_1 | location_2 | location_3 |
+---------+-------+------------+------------+------------+
| 1 | jenny | New York | Memphis | Las Vegas |
| 2 | chris | Washington | Dallas | NULL |
| 3 | harry | Dallas | Las Vegas | Washington |
+---------+-------+------------+------------+------------+
我尝试使用左连接和分组进行多次查询,但我似乎只获得了第一个位置。
提前致谢。
答案 0 :(得分:0)
数据结构和方向更改通常称为转置。在此Transpose中,如果您希望添加动态值,则将其称为PIVOT。
看看这是否有帮助: 将MySQL行转换为列名称 - DYNAMIC https://dba.stackexchange.com/questions/89681/transpose-mysql-rows-as-column-names-dynamic
MySQL数据透视表: MySQL pivot table
答案 1 :(得分:0)
我试着尽可能快地给你写这个StoredPorcedure。它会将行转换为列。
你仍然需要在这个SP中管理空值,但我相信它会让你更好地实现你的要求。
检查此FIDDLE
<强> CODE 强>
DELIMITER $$
CREATE PROCEDURE sp_Result()
BEGIN
SET SESSION group_concat_max_len = 500000;
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN ul.location_id = ', l.id,
' THEN l.location END) '))
INTO @sql
FROM user_locations ul
INNER JOIN locations l ON ul.location_id = l.id;
SET @sql = CONCAT(
'SELECT ul.user_id, u.user, ', @sql,
' FROM user_locations ul INNER JOIN users u
ON ul.user_id = u.id INNER JOIN locations l ON ul.location_id = l.id GROUP BY ul.user_id, u.user;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
<强> P.S。强>
根据您的需要对其进行修改,因为它不会返回您想要的确切结果。