【问题标题】:How to replace reference ID with value如何用值替换参考 ID
【发布时间】: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


【解决方案1】:

你可以这样处理

SELECT id,house,
(
  CASE
    WHEN room1 > 0 THEN (SELECT status FROM status WHERE status_code=room1)
 END) AS room1,
(
  CASE
    WHEN room2 > 0 THEN (SELECT status FROM status WHERE status_code=room2)
 END) AS room2,
(
  CASE
    WHEN room3 > 0 THEN (SELECT status FROM status WHERE status_code=room3)
 END) AS room3
 FROM houses

Live DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多