【发布时间】:2017-11-27 03:35:31
【问题描述】:
我有一个包含许多表的 MySQL 数据库。与此问题相关的是:
TABLE: Schedule (For booking time on a machine)
- SlotID (INTEGER - AUTO_INCREMENT - PRIMARY KEY)
- SlotDate (VARCHAR)
- SlotStart (INTEGER)
- SlotStop (INTEGER)
- UserID (INTEGER - FOREIGN KEY REFERENCES User.UserID)
- OperatorID (INTEGER - FOREIGN KEY REFERENCES User.UserID)
TABLE: Treatment (Defines what the machine should do)
- TreatmentID (INTEGER - AUTO_INCREMENT - PRIMARY KEY)
- SOME OTHER BOOLEANS TO ACTIVATE EACH SENSOR (Irrelevant)
TABLE: ScheduleTreatment (Many to many relationships between Schedule & Treatment)
- SlotID (INTEGER - FOREIGN KEY REFERENCES Schedule.SlotID)
- TreatmentID (INTEGER - FOREIGN KEY REFERENCES Treatment.TreatmentID)
TABLE: Individual (each treatment will be applied to n different individuals)
- IndID (INTEGER - AUTO_INCREMENT - PRIMARY KEY)
- Active (BOOLEAN if 0 this should be ignored and not counted)
- TreatmentID (INTEGER - FOREIGN KEY REFERENCES Treatment.TreatmentID)
TABLE: User (Table with user data)
- UserID (INTEGER - AUTO_INCREMENT - PRIMARY KEY)
- Username (VARCHAR)
- Some other irrelevant fields
所以保留的机器插槽放在Schedule,要执行的操作放在Treatment,执行这些操作的个人(每个处理都对许多相同的个人进行统计)放在@987654325 @ 和 ScheduleTreatment 将插槽链接到应该在该插槽期间进行的不同处理(并且可以使用 TreatmentID 外键获得执行这些处理的个人。OperatorID 提供到用户的链接(不是插槽的所有者)将负责忽略该过程。
我想执行 Slot 预览,以便用户可以看到所有信息(因此查询应以 WHERE Schedule.UserID = ? 结尾),这意味着获取 Schedule.*、操作员的用户名和两个计数:一个有多少治疗(这个相对简单,ScheduleTreatment 和一个GROUP BY)和另一个有多少人(在所有分配的治疗中),我完全不知道怎么做。没有治疗的槽或有治疗但没有个体的槽也应该出现(对应的计数为 0)。
在我看来,这需要按两个不同的标准进行分组,但它看起来也可以在一个(比我更聪明)查询中完成。我已经设法分别完成它们,但不是在同一个查询中。这是一个获取 Treatment.* 和分配给它的所有个人的示例:
SELECT Treatment.TreatmentID, COUNT(Individual.TreatmentID) AS Individuals
FROM Treatment INNER JOIN Individual ON Individual.TreatmentID =
Treatment.TreatmentID GROUP BY Individual.TreatmentID ORDER BY TreatmentID
提前致谢,
【问题讨论】:
-
我没有读完所有这些。见meta.stackoverflow.com/questions/333952/…
标签: mysql join group-by many-to-many one-to-many