簡體   English   中英

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

[英]WHERE clause, on joined table, with multiple rows

我有一個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表包含其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就足以完成我想要實現的任務。

我認為子查詢可能會這樣做,但我不知道從哪里開始。

在沒有所有必要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

如何將其捆綁到此代碼中?

在我看來,你想要對學生進行外聯。

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

要獲得僅包含特定年齡組學生的事件,請使用以下查詢。

   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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM