【发布时间】: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'从“房间”表