优化查询以使用两个表之间的联接并将行转换为列

时间:2018-08-23 15:57:02

标签: mysql pivot

我知道这是一个已经解决的问题,但是我发现的所有答案都不适合我的需求,而且,更多的是,我无法自己提出适当的解决方案。

我解释了这种情况:

2个表(用户,用户首选项) 您可能会猜到,第一个有名称,姓氏,ID和登录名(有更多数据,但是这些是我需要的),而第二个有user_id,preferences_key和preferences_value。

如果我运行查询:

select a.id, a.login, a.first_name, a.last_name, b.preferences_key from users a, user_preferences b where a.id=b.user_id and b.preferences_key like 'msg%';

我收到这样的答复:

+----+---------+---------------+---------------+----------------------+
| id | login   | first_name    | last_name     | preferences_key      |
+----+---------+---------------+---------------+----------------------+
|  4 | usrn1   | User1         | NumberOne     | msg002               |
|  7 | usrn5   | User5         | NumberFive    | msg001               |
|  7 | usrn5   | User5         | NumberFive    | msg002               |
| 10 | usrn9   | User0         | NumberNine    | msg002               |
+----+---------+---------------+---------------+----------------------+

我正在尝试找出如何从该视图切换到该视图:

+----+---------+---------------+---------------+--------+--------+
| id | login   | first_name    | last_name     | msg001 | msg002 |
+----+---------+---------------+---------------+--------+--------+
|  4 | usrn1   | User1         | NumberOne     | No     | Yes    |
|  7 | usrn5   | User5         | NumberFive    | Yes    | Yes    |
| 10 | usrn9   | User0         | NumberNine    | No     | Yes    |
+----+---------+---------------+---------------+--------+--------+

如果您有任何建议,将不胜感激,并且,如果您可以添加更多说明,我将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

实际上,并没有一种简单的方法可以像我想的那样轻松地旋转表。

有以下手动方法,可以多次加入同一张表。类似于以下应该的方法:

SELECT 
    a.id, a.login, a.first_name, a.last_name, 
    IF(b1.preferences_key IS NULL, 'No', 'Yes') msg001,
    IF(b2.preferences_key IS NULL, 'No', 'Yes') msg002
FROM
    users a
LEFT JOIN user_preferences b1
    ON b1.user_id = a.id
    AND b1.preferences_key = 'msg001'
LEFT JOIN user_preferences b2
    ON b2.user_id = a.id
    AND b2.preferences_key = 'msg002';

如果这没有帮助。查看MySQL pivot table