【问题标题】:MySQL merge columns from multiple tablesMySQL合并来自多个表的列
【发布时间】:2020-02-01 10:41:56
【问题描述】:

我正在尝试通过以下方式选择一些数据:

field:
+----------+------------+-----------+
|     id   |   room_id  | server_id |
+----------+------------+-----------+
|     1    |      34    |     0     |
|     2    |      34    |     0     |
|     3    |      35    |     1     |
+----------+------------+-----------+


user_position:
+----------+------------+-----------+
| user_id  | server_id  | position  |
+----------+------------+-----------+
|     11   |      0     |     2     |
|     17   |      1     |     25    |
|     19   |      0     |     28    |
+----------+------------+-----------+

room:
+----------+------------+-----------+
|     id   | server_id  | background|
+----------+------------+-----------+
|     34   |      0     |  #d91a1a  |
|     35   |      1     |  #f81b2a  |
|     36   |      0     |  #191b4a  |
+----------+------------+-----------+


RESULT:
(I hope I didn't mess it up)
+----------+------------+-----------+------------+------------+
|     id   | server_id  | background|  room_id   |  user_id   |
+----------+------------+-----------+------------+------------+
|     1    |      0     |  #d91a1a  |     34     |    null    |
|     2    |      0     |  #d91a1a  |     34     |     11     |   
|     3    |      1     |  #f81b2a  |     35     |    null    |
|    25    |      1     |    null   |    null    |     17     |
|    28    |      0     |    null   |    null    |     19     |
+----------+------------+-----------+------------+------------+


不幸的是,我无法编写正确的查询来实现此结果。我能得到的最好的结果是 field.id、user_position.position 和 field.room_id、user_position.room_id 列是分开的。我不知道如何将它们合并在一起。

有人可以帮帮我吗?

更新

好的,经过一番尝试,我得到了这个:

SELECT field.id, field.server_id, field.room_id, null AS user_id, room.background
FROM field
LEFT JOIN room ON room.id = field.room_id
WHERE field.server_id = 0
UNION
SELECT user_position.position, user_position.server_id, null, user_position.user_id, room.background
FROM user_position
LEFT JOIN room ON room.id = (SELECT field.room_id FROM field WHERE field.id = user_position.position)
WHERE user_position.server_id = 0

现在它正在工作我只是想问是否有更好的方法来实现相同的结果。还是您认为这个查询足够好?

【问题讨论】:

  • 你能解释一下选择用户位置的逻辑吗?为什么位置 2 没有出现?
  • field.id 和 user_position.position 基本上是代表相同事物的值,但它们位于不同的表中。我想选择这两个列并将它们合并在一起,就像您在“id”列下的“结果”中看到的那样。
  • 这看起来像是设计不佳的问题
  • 我看到的另一个问题是服务器 ID 在房间中重复,因此哪个房间和背景(例如 2)的服务器 ID 为 0,房间中有 2 个条目,但您的结果只有 1 个。
  • 哦,我应该提到有一个'server'表,'server_id'是它的外键,'user_id'来自'user'表和'room_id'从“房间”表

标签: mysql sql database select


【解决方案1】:

有了给定的数据集,你可以试试下面 -

SELECT COALESCE(F.id, UP2.position) id
      ,COALESCE(F.server_id, UP2.server_id) server_id
      ,UP2.background
      ,F.room_id
      ,UP2.user_id
FROM field F
LEFT OUTER JOIN (SELECT UP.server_id, R.background, UP.position, UP.user_id
                 FROM (SELECT server_id, position, user_id, ROW_NUMBER()OVER(PARTITION BY server_id ORDER BY user_id) rn
                       FROM user_position) UP
                 JOIN (SELECT server_id, background, ROW_NUMBER()OVER(PARTITION BY server_id ORDER BY id) rn
                       FROM room) R ON UP.rn = R.rn
                                    AND UP.server_id = R.server_id) UP2 ON F.id = UP2.position
UNION
SELECT COALESCE(F.id, UP3.position) id
      ,COALESCE(F.server_id, UP3.server_id) server_id
      ,UP3.background
      ,F.room_id
      ,UP3.user_id
FROM field F
RIGHT OUTER JOIN (SELECT UP.server_id, R.background, UP.position, UP.user_id
                 FROM (SELECT server_id, position, user_id, ROW_NUMBER()OVER(PARTITION BY server_id ORDER BY user_id) rn
                       FROM user_position) UP
                 JOIN (SELECT server_id, background, ROW_NUMBER()OVER(PARTITION BY server_id ORDER BY id) rn
                       FROM room) R ON UP.rn = R.rn
                                    AND UP.server_id = R.server_id) UP3 ON F.id = UP3.position
ORDER BY id

Here 是演示。

【讨论】:

  • 您好,感谢您的回复。我试过了,结果不是我想要的。无论如何,我用现在按预期工作的查询更新了帖子,你能看看它并告诉我这样做是否可以吗?我真的很感激。
  • @KrKOo,我已经用示例数据尝试过您的查询,但没有给出正确的结果。
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2019-01-10
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多