WHERE子句,在连接表上,有多行

时间:2016-09-24 21:42:12

标签: mysql join

我有一个incidents表与一些表有1 to many的关系 - 主要是针对这个问题的上下文people

基本上,一个incident可能有很多people(涉及)。

目前,我正在使用此查询检索incident详细信息 - 以及以逗号分隔的逗号分隔字符串:

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

这很好用,并产生如下数据:

Data

我现在要做的是过滤这些报告,以便仅涉及其中一个人是某一年级学生的事件

可以通过将其ID加入students表来找到此信息。 students表包含其IDYear_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就足以完成我想要完成的任务。

我认为子查询可能会这样做,但我不知道从哪里开始。

我将用于访问此信息的代码(对于 7年级学生)而没有所有必要的incidents数据(我认为):

SELECT DISTINCT( p.`Incident_ID` )
FROM `people` p
LEFT JOIN `student` stu ON p.Person_ID = stu.db_id
WHERE stu.Year_Group = 7

如何将其捆绑到此代码中?

2 个答案:

答案 0 :(得分:0)

在我看来,你想要对学生进行外联。

LEFT OUTER JOIN 'student' stu on ip.Person_ID = stu.db_id

这将包括所有事件。然后,在WHERE子句中,添加过滤器

WHERE 1 NOT IN ( SELECT Category_ID FROM `categories_link` WHERE `Incident_ID` = i.ID ) AND `stu`.`Year_Group` = 7

答案 1 :(得分:0)

要获取仅包含特定年龄组学生的事件,请使用以下查询。

   SELECT p.Incident_ID 
   FROM people p
   JOIN student stu ON p.Person_ID = stu.db_id
   WHERE stu.Year_Group = 11 
   group by p.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 )
    and i.ID in //Here you will put the above query
    (
       SELECT p.Incident_ID 
       FROM people p
       JOIN student stu ON p.Person_ID = stu.db_id
       WHERE stu.Year_Group = 11 
       group by p.Incident_ID 
    )
    GROUP BY i.ID
    ORDER BY i.`Date` DESC, p.`ID` DESC