【发布时间】:2016-09-24 21:42:11
【问题描述】:
我有一个 incidents 表,它与几个表有 1 to many 关系 - 主要是,对于这个问题的上下文,people。
基本上,一个incident 可能有多个people(涉及)。
目前,我正在检索 incident 详细信息 - 以及使用此查询连接的以逗号分隔的人员 ID 字符串:
SELECT
i.`ID` AS `id`,
i.`Author_ID` AS `author_id`,
i.`Description` AS `description`,
i.`Date` AS `date`,
i.`Datetime_Created` AS `created`,
p.`Title` AS `period`,
GROUP_CONCAT(DISTINCT ip.`Person_ID` ORDER BY FIELD(ip.`Involvement`, 'V', 'P', 'W') ASC SEPARATOR ',') AS `people_ids`,
( SELECT COUNT(`ID`) FROM `reports` r WHERE r.Incident_ID = i.ID ) AS `reports`,
i.`Status` AS `status`
FROM `incidents` i
LEFT JOIN `reports` ir ON ir.Incident_ID = i.ID
LEFT JOIN `people` ip ON ip.Incident_ID = i.ID
LEFT JOIN `periods` p ON i.Period_ID = p.ID
WHERE 1 NOT IN ( SELECT Category_ID FROM `categories_link` WHERE `Incident_ID` = i.ID )
GROUP BY i.ID
ORDER BY i.`Date` DESC, p.`ID` DESC
这工作正常,并产生如下数据:
我现在要做的是过滤这些报告,以便仅涉及其中一个人是某个年级学生的事件。
可以通过将他们的 ID 加入 students 表来找到此信息。 students 表包含它们的 ID 和一个 Year_Group 字段。
其中一个复杂之处在于people_involved 表中的一些 ID可能不仅仅与学生相关 - 他们可能是工作人员、家长或我们社区的其他成员。
我不想排除涉及其他人的报告,只要有来自特定年级的学生也参与。
我编写了一个似乎部分有效的查询:
SELECT
i.`ID` AS `id`,
i.`Author_ID` AS `author_id`,
i.`Description` AS `description`,
i.`Date` AS `date`,
i.`Datetime_Created` AS `created`,
p.`Title` AS `period`,
GROUP_CONCAT(DISTINCT ip.`Person_ID` ORDER BY FIELD(ip.`Involvement`, 'V', 'P', 'W') ASC SEPARATOR ',') AS `people_ids`,
( SELECT COUNT(`ID`) FROM `reports` r WHERE r.Incident_ID = i.ID ) AS `reports`,
i.`Status` AS `status`
FROM `incidents` i
LEFT JOIN `reports` ir ON ir.Incident_ID = i.ID
LEFT JOIN `people` ip ON ip.Incident_ID = i.ID
<< LEFT JOIN `student` stu ON ip.Person_ID = stu.db_id >>
LEFT JOIN `periods` p ON i.Period_ID = p.ID
WHERE 1 NOT IN ( SELECT Category_ID FROM `categories_link` WHERE `Incident_ID` = i.ID )
<< AND `stu`.`Year_Group` = 11 >>
GROUP BY i.ID
ORDER BY i.`Date` DESC, p.`ID` DESC
但我无法想象一个简单的JOIN 就足以完成我想要完成的任务。
我认为子查询可以做到这一点,但我不知道从哪里开始。
在没有所有必要的incidents 数据的情况下,我将用于访问此信息(7 年级学生)的代码将是(我认为):
SELECT DISTINCT( p.`Incident_ID` )
FROM `people` p
LEFT JOIN `student` stu ON p.Person_ID = stu.db_id
WHERE stu.Year_Group = 7
如何将其捆绑到此代码中?
【问题讨论】:
-
我假设您需要事件,其中至少事件应该包含来自特定年龄组的学生(在您的情况下 Year_Group 11)。我已经给出了解释条件的答案,请检查您是否正在寻找对于