我的sql join查询有计数

时间:2017-05-09 17:54:03

标签: sql mysqli pdo

我不确定如何做到。如果有任何解决方案请帮帮我.... 我有2个表courseschedule现在我想要显示课程中的所有数据,如果计划表有任何数据,那么显示它..

我有表名= 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|
|----|---|----------------

3 个答案:

答案 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是一个聚合函数,与MAXSUM非常相似。只有,它需要一个分隔符作为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;