首页 > 解决方案 > 优化查询以使用两个表之间的连接并将行转换为列

问题描述

我知道这是一个已经完成的问题,但是我找到的所有答案都不适合我的需要,而且,更重要的是,我无法自己找到合适的解决方案。

我解释一下情况:

第一个表中有 2 个表(用户、user_preferences),正如您可能猜到的那样,名称、姓氏、id 和登录名(还有更多数据,但这些是我需要的),在第二个表中,我们有 user_id、preferences_key 和偏好值。

如果我运行我的查询:

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

如果您有任何建议,我们将不胜感激,顺便说一句,如果您能添加更多解释,我将更加感激。

谢谢

标签: mysqlpivot

解决方案


据我所知,没有一种简单的方法可以像您想要的那样轻松旋转表格。

通过JOIN多次连接到同一个表,有以下手动方法。像下面这样的东西应该可以工作:

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 数据透视表


推荐阅读