我不确定如何做到。如果有任何解决方案请帮帮我....
我有2个表course
和schedule
现在我想要显示课程中的所有数据,如果计划表有任何数据,那么显示它..
我有表名= schedule
--------------------------------------------------------
| course_id | room | day | time |
--------------------------------------------
| 2 | 401 |saturday| 9:00 - 13:00 |
--------------------------------------------
| 3 | 401 | sunday | 9:00 - 13:00 |
--------------------------------------------
| 2 | 402 | monday | 9:00 - 13:00 |
--------------------------------------------
| 3 | 403 | tuesday| 14:00 - 17:00|
--------------------------------------------
| 4 | 401 | tuesday| 9:00 - 13:00 |
--------------------------------------------
| 2 | 402 |wednesday|14:00 - 17:00|
--------------------------------------------
和另一个表名=课程
----------------------------------
| id | course_code | course_name |
----------------------------------
| 2 | cse1 | cse |
---------------------------------
| 3 | eee | eee |
---------------------------------
| 4 | ct1 | ct |
---------------------------------
| 5 | ct2 | ct |
----------------------------------
| 6 | cse2 | ct |
----------------------------------
现在如何获得这样的输出..
----------------------------------
| course code | course name | info |
|----------------------------------
|cse1|cse|401,satueday-9:00-13:00; 402,monday-9:00-13:00; 402,wednesday-14:00-17:00|
|------------------------
|cse2|cse|not assigned|
|----|---|-----------------
|eee |eee|401,sunday-9:00-13:00;403,tuesday-14:00-17:00 |
|----|---|-----------------
|ct1 |ct |401,tuesday-9:00-13:00|
|----|---|----------------
|ct2 |ct | not assigned|
|----|---|----------------
答案 0 :(得分:1)
首先,您需要将两个表连接在一起,然后将“计划”聚合到课程中分组的单个字符串值。
免责声明:代码未经过测试,因为我附近没有MySQL数据库!
我已经习惯了甲骨文所以我不知道哪个函数在MySQL中有用来聚合字符串,所以在快速搜索后,我发现https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws
SELECT c.course_code,
c.course_name,
CONCAT_WS(',',CONCAT(s.room,',',s.day,'-',s.time)) as info
FROM COURSE c
LEFT JOIN SCHEDULE s ON c.id = s.course_id
GROUP BY c.course_code,c.course_name
它应该产生接近你期望的结果,除了“未分配”,这将做我无法预测的事情,这取决于WS_CONCAT
如何处理空值。
<强>解释强>
CONCAT_WS
是一个聚合函数,与MAX
或SUM
非常相似。只有,它需要一个分隔符作为firts参数,以及你想要聚合的列。
如果要在查询聚合时显示额外的列(例如课程代码和名称),则需要在GROUP BY
子句中指定它们。
另外,请尝试更改LEFT JOIN
INNER JOIN
并注意区别:不会返回没有日程安排的课程。
答案 1 :(得分:0)
您可以使用XML方法执行此操作:
SELECT room + ' ' + day + ' ' + time + ', ' AS 'data()'
FROM schedule
FOR XML PATH('')
答案 2 :(得分:0)
group_concat
函数是您的朋友(与coalesce
合并)。
select c.course_code,
c.course_name,
coalesce(group_concat(s.room, ', ', s.day, '-', s.time separator ';'), 'not assigned') info
from course c
left outer join schedule s on c.id = s.course_id
group by c.course_code;