MySQL 连接包含价格、房间和季节的表

标签 mysql join pivot-table

我有三个表,用户可以存储季节、房间和价格。此处显示表“季节”是为了更好地理解我想要实现的目标,并且它不会在查询中使用。

表格是:

    table seasons

    |usr_id | season_id | season_name |
    |-------|-----------|-------------|
    |   1   |     1     |     June    |
    |   1   |     2     |     July    |
    |   1   |     3     |    August   |


    table rooms

    |usr_id | room_id |   room_name   |
    |-------|---------|---------------|
    |  1    |    1    |    Studio_1   |
    |  1    |    2    |    Studio_2   |
    |  5    |    3    |  Other studio |


    table prices

    |usr_id | price_id | room_id | season_id | price |
    |-------|----------|---------|-----------|-------|
    |   1   |     1    |    1    |     1     |  10   |
    |   1   |     2    |    2    |     1     |  100  |
    |   1   |     3    |    1    |     2     |  20   |
    |   1   |     4    |    2    |     2     |  200  |
    |   1   |     5    |    1    |     3     |  30   |
    |   1   |     6    |    2    |     3     |  300  |

我想查询数据库并获取每个季节每个房间的价格(在此示例中,user_id = 1)。我期望得到的是:

studio_1 | 10 | 20 | 30 |
---------|----|----|----|

studio_2 | 100 | 200 | 300 |
---------|-----|-----|-----|

我尝试连接表“房间”和“价格”,但无法获得正确的结果。我使用以下内容

    SELECT r.room_name, p.price
    FROM rooms AS r
    LEFT JOIN prices AS p ON r.room_id = p.room_id
    WHERE p.usr_id = 1

每个用户都可以添加“无限”的季节和房间

有什么建议吗? 谢谢

最佳答案

您正在描述一个数据透视表。您可以使用 GROUP BY 将结果减少到每个 room_id 一行,然后使用条件表达式仅显示每个季节的价格。

SELECT r.room_name, 
    MAX(CASE p.season_id WHEN 1 THEN p.price END) AS price_season_1,
    MAX(CASE p.season_id WHEN 2 THEN p.price END) AS price_season_2,
    MAX(CASE p.season_id WHEN 3 THEN p.price END) AS price_season_3,
    MAX(CASE p.season_id WHEN 4 THEN p.price END) AS price_season_4
FROM rooms AS r
LEFT JOIN prices AS p ON r.room_id = p.room_id
WHERE p.usr_id = $usr_id
GROUP BY r.room_id

编写数据透视表查询时,必须对每一列进行硬编码,并为每个相应的值编写一个表达式。

<小时/>

回复您的评论:

the number of seasons is not the same for each user, as each user will be able to create as many as seasons he needs.

然后您需要执行前面的查询,以便您的应用程序可以发现给定用户所需的季节。

SELECT season_id, season_name FROM seasons where usr_id = 1

然后使用此数据在选择列表中根据该用户的需要形成尽可能多的列。使用应用程序代码执行此操作。

如果您阅读有关数据透视表的内容,您会发现这始终是必要的。在编写查询之前,您必须知道这些列。 SQL 在执行时无法根据它找到的数据值添加更多列。

关于MySQL 连接包含价格、房间和季节的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922758/

相关文章:

mysql - 在 LOAD DATA 之前创建索引以提高 MySQL 的性能

php - 如何在加入mysql sql中的表之前加上条件?

mysql - 需要 SQL 专家来处理复杂的查询

c# - 当缺少数据时,如何(是吗?)防止数据的 PivotTablization 导致 "#DIV/0!"等?

Mysql插入外键

mysql - 获取两个日期之间的数据

mysql - 按日期范围检索数据

MySQL 左连接和分组依据

python - 根据索引合并两个数据帧(一个从数据透视表创建的 df)

google-api - 通过 API 将数据透视表添加到谷歌电子表格