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