1

我有一个 MySql 数据库,其中包含三个需要在查询中组合的表:计划、注册和候补名单。他们正在实施一个基本的班级注册系统。

时间表包含预定的课程。当用户注册一个班级时,他们的用户帐户 id 和预定班级的 id 存储在注册中。如果某个班级已满员,则将它们存储在候补名单中。所有三个表共享一个 scheduleId 列,该列标识每个类。

当我查询日程表时,我还需要返回已注册和等待列表列,这些列表示已注册并等待特定 scheduleId 的用户数。

我提出的一个初步查询是:

select s.id, s.classDate, s.instructor, COUNT(e.id) as enrolled
from schedule as s
left outer join enrolled as e
on s.id = e.scheduleId
group by s.id

这适用于其中一个或另一个,但显然我无法以这种方式获取已注册和候补表的值。任何人都可以建议这样做的好方法吗?

4

3 回答 3

4

使用嵌套的 SELECT 查询。假设您的架构有点,像这样的东西怎么样(可能不适用于某些 SQL 风格):

select s.id, s.classDate, s.instructor, 
       (select COUNT(e.id) from enrolled e where e.scheduleId = s.id) as enrolled,
       (select COUNT(w.id) from waitlist w where w.scheduleId = s.id) as waiting
from schedule as s
group by s.id
于 2009-01-22T03:16:55.023 回答
3

我会用另一个左连接和两个内联计数(不同)来做到这一点

select s.id, s.classDate, s.instructor ,
count(distinct e.id) as enrolled,
count(distinct w.id) as waiting
from schedule as s
left outer join enrolled as e
on s.id = e.scheduleID
left outer join waitlist as w
on s.id = w.scheduleID
group by s.id

当我运行这种方法与子查询相比时,它的执行速度大约是它的两倍,但我正在查看一个非常小的结果集。

于 2009-01-22T04:56:04.777 回答
0

两种快速方法:

1-COUNT(DISTINCT e.id), COUNT(DISTINCT w.id)用于获取每个表中唯一实例的数量,然后加入两者。这可能是非常低效的。

2- 在FROM子句中使用子查询(仅适用于 MySQL 5.0 及更高版本):

SELECT s.id, s.classDate, s.instructor, tmpE.c AS enrolled, tmpW.c AS waiting
FROM
  schedule AS s,
  ( SELECT scheduleID, COUNT(*) AS c FROM enrolled GROUP BY scheduleID ) AS tmpE,
  ( SELECT scheduleID, COUNT(*) AS c FROM waiting GROUP BY scheduleID ) AS tmpW
WHERE
    s.id = e.scheduleID
    AND s.id = w.scheduleID
GROUP BY s.id

不过,我可能错过了那里的左连接。

于 2009-01-22T03:10:53.117 回答