MYSQL连接到多个列

时间:2018-03-16 07:10:07

标签: mysql left-join

我正在尝试选择一对多关系的结果并将结果放在多列中。我的表看起来像:

表用户:

+----+----------+ 
| 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 | 
+---------+-------+------------+------------+------------+ 

我尝试使用左连接和分组进行多次查询,但我似乎只获得了第一个位置。

提前致谢。

2 个答案:

答案 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。

根据您的需要对其进行修改,因为它不会返回您想要的确切结果。