【问题标题】:SQL JOIN from assignment table来自分配表的 SQL JOIN
【发布时间】:2020-01-27 12:52:59
【问题描述】:

我有以下表格:

rooms

rid | roomname   | ...
----------------------
1   | Pantry     | ...
2   | Conference | ...
...

employees

eid | lastname  | firstname
---------------------------
1   | Zufall    | Rainer
2   | Piper     | Peter
.... 

assignments

aid | room | employee | weekday
-------------------------------
1   |  2   |   1      |   1
2   |  2   |   1      |   2
3   |  2   |   2      |   3
4   |  2   |   1      |   4
5   |  2   |   1      |   5
6   |  1   |   2      |   1
7   |  1   |   2      |   3
8   |  1   |   2      |   5 

现在我想写一个查询,按以下格式列出所有房间及其分配:

roomname   | Monday | Tuesday | Wednesday | Thursday | Friday
--------------------------------------------------------------
Conference | Zufall | Zufall  |   Piper   |  Zufall  |  Zufall
Pantry     | Piper  |  NULL   |   Piper   |   NULL   |  Piper

我写了查询

SELECT r.roomname, e.lastname AS Monday
FROM rooms AS r
LEFT JOIN assignments AS a ON r.rid = a.room AND a.weekday = 1
LEFT JOIN employees AS e ON a.employee = e.eid

什么给了我周一的所有作业,但我如何将它与其他工作日的作业结合起来?

提前致谢。 拉尔斯

【问题讨论】:

  • 考虑处理表示层/应用程序级代码中的数据显示问题,假设您有(例如,作用于有序数组的简单 PHP 循环)。
  • 你能给出你期望的结果吗?
  • @MohammadShehroz 他们做到了
  • @Strawberry 我看到了

标签: mysql sql join pivot left-join


【解决方案1】:

你可以做条件聚合:

select 
    r.roomname, 
    max(case when a.weekday = 1 then e.lastname end) monday,
    max(case when a.weekday = 2 then e.lastname end) tuesday,
    max(case when a.weekday = 3 then e.lastname end) wednesday,
    max(case when a.weekday = 4 then e.lastname end) thursday,
    max(case when a.weekday = 5 then e.lastname end) friday
from rooms as r
left join assignments as a on r.rid = a.room
left join employees as e on a.employee = e.eid
group by r.roomname, r.id

【讨论】:

    【解决方案2】:

    使用条件聚合:

    SELECT r.roomname,
           MAX(CASE WHEN a.weekday = 1 THEN e.lastname END) AS Monday,
           MAX(CASE WHEN a.weekday = 2 THEN e.lastname END) AS Tuesday,
           . . .
    FROM rooms r LEFT JOIN
         assignments a
         ON r.rid = a.room LEFT JOIN
         employees e
         ON a.employee = e.eid
    GROUP BY r.roomname;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2021-12-30
      • 2021-07-11
      • 1970-01-01
      相关资源
      最近更新 更多