mysql—优化查询以在两个表之间使用连接并将行转换为列

56lgkhnf  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(262)

我知道这是一个已经做了的问题,但我发现所有的答案不适合我的需要,更重要的是,我无法尾随一个适当的解决办法自己。
我解释情况:
两个表(user,user\u preferences)在第一个表中,正如您可能猜到的,有name,last name,id和login(有更多的数据,但这些是我需要的),在第二个表中,我们有user\u id,preferences\u key和preferences\u 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    |
+----+---------+---------------+---------------+--------+--------+

如果您有任何建议,我将不胜感激,顺便说一句,如果您能再补充一些解释,我将不胜感激。
谢谢您

hc8w905p

hc8w905p1#

据我所知,没有一种像你想的那样简单地调整table的方法。
通过多次连接到同一个表,有以下手动方法。类似于以下的方法应该可以工作:

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

相关问题