【问题标题】:MySQL Join table on itself horizontally [duplicate]MySQL自身水平连接表[重复]
【发布时间】:2020-11-04 00:32:00
【问题描述】:

我一直在尝试解决这个问题,我知道这与连接有关,但似乎无法解决

当我运行以下查询时:

SELECT user_id, meta_key, meta_value 
FROM usermeta 
WHERE usermeta.meta_key = 'my_key' 
OR usermeta.meta_key = 'first_name' 
OR usermeta.meta_key = 'last_name'

我当然得到了数据:

user_id    meta_key    meta_value
1          first_name  John
2          first_name  Jane
3          first_name  Tom
1          last_name   Doe
2          last_name   Cobb
3          last_name   Smith
1          my_key      ABC
2          my_key      DEF
3          my_key      GHI

我不知道加入这些数据的正确方法:

user_id     first_name   last_name   my_key
1           John         Doe         ABC
2           Jane         Cobb        DEF
3           Tom          Smith       GHI

如何在 MySQL 中实现这一点?任何帮助表示赞赏。

【问题讨论】:

标签: mysql wordpress join pivot-table


【解决方案1】:

按 id 分组并使用条件聚合:

SELECT user_id, 
       MAX(CASE WHEN meta_key = 'first_name' THEN meta_value END) first_name,
       MAX(CASE WHEN meta_key = 'last_name' THEN meta_value END) last_name,
       MAX(CASE WHEN meta_key = 'my_key' THEN meta_value END) my_key
FROM usermeta 
WHERE meta_key = 'my_key' 
   OR meta_key = 'first_name' 
   OR meta_key = 'last_name'
GROUP BY user_id

请参阅demo
结果:

| user_id | first_name | last_name | my_key |
| ------- | ---------- | --------- | ------ |
| 1       | John       | Doe       | ABC    |
| 2       | Jane       | Cobb      | DEF    |
| 3       | Tom        | Smith     | GHI    |

编辑
您可以将上述查询加入到另一个表中:

SELECT g.user_id, g.first_name, g.last_name, g.my_key, t.email
FROM (
  <the query here>
) g INNER JOIN othertable t
ON t.id = g.user_id

【讨论】:

  • 您好,谢谢!这行得通......但我忘了提到我有另一个表,这些用户的电子邮件地址将存在。我的问题中初始表中的 user_id 值与另一个表中的“ID”列的值相同(它们是外键),我如何将他们各自的电子邮件地址加入到 GROUP BY 的结果中所以他们'重新准确并且为正确的用户显示正确的电子邮件?不知道我是否应该更新这个问题,因为你已经回答了,但我忘了包括那个细节
  • 查看我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
相关资源
最近更新 更多