【发布时间】:2019-06-25 09:38:28
【问题描述】:
假设我有两张桌子:
+------------------------------------+
| `houses` |
+----+-------+-------+-------+-------+
| id | house | room1 | room2 | room3 |
+----+-------+-------+-------+-------+
| 1 | a | 1 | 1 | 2 |
| 2 | b | 1 | 3 | 1 |
| 3 | c | 2 | 2 | 1 |
+----+-------+-------+-------+-------+
+------------------------+
| `status` |
+-------------+----------+
| status_code | status |
+-------------+----------+
| 1 | empty |
| 2 | occupied |
| 3 | full |
+-------------+----------+
现在我想将 room1、room2 和 room3 的 id 更改为 TABLE status 的状态,如下所示:
+---------------------------------------------+
| `houses` |
+----+-------+----------+----------+----------+
| id | house | room1 | room2 | room3 |
+----+-------+----------+----------+----------+
| 1 | a | empty | empty | occupied |
| 2 | b | empty | full | empty |
| 3 | c | occupied | occupied | empty |
+----+-------+----------+----------+----------+
我知道一种解决方案,但我相信有一种更简单的方法可以做到这一点:
SELECT
h.*,
s1.status AS room1,
s2.status AS room2,
s3.status AS room3
FROM houses h
JOIN status s1 ON h.room1 = s1.status_code
JOIN status s2 ON h.room2 = s2.status_code
JOIN status s3 ON h.room3 = s3.status_code
更新
MySQL pivot table 解决方案不适合我,因为上面的示例是我使用的简化版本。有十多个不同的状态,为一个房间写一个 40 行的 CASE 函数不是一个机会。 status 必须来自状态表。
【问题讨论】:
-
MySQL pivot table的可能重复
-
这不是 100% 匹配的重复,但问题(可以)使用相同的方法..
SELECT MAX(CASE WHEN houses. room1 = 1 THEN 'empty' .... END) AS room1... GROUP BY id, house -
我认为您的解决方案写起来更快、更直观、更容易。
-
您的解决方案基于我确切知道每个状态代码。问题是这些表格是简化的表格,一个房间可能比我写的三个有更多的状态可能性,所以状态必须来自数据透视表。
-
你的
house表应该是两张表,因为一栋房子可以有1000个房间,所以你不应该创建额外的列,而是在房间表中插入新行。
标签: mysql