2016-09-24 28 views
1

我有一個incidents表,它與幾個表有關係1 to many - 主要是針對此問題的上下文peopleWHERE子句,在連接表上,有多行

基本上,一個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 

這工作得很好,併產生類似的數據:

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就足夠了,我想實現的任務。

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

我會用沒有所有必要的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 

如何捆綁那這個代碼?

+0

我認爲你需要的事件,其中至少應該事件具有特定的年齡組包括學生(你的情況Year_Group 11)。我已經給了答案解釋的條件,檢查如果這是你在找什麼 –

回答

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 

原始查詢通過與me.This方式,您將得到所有的事件寫在上面的查詢與返回事故和羣體參與的人,所以在你原來的查詢過濾器的事件,讓學生從具體年份參與團體加上其他人也參與(如果有)。我認爲這將解決您的問題。

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 
+0

這正是我想要的 - 謝謝你,基蘭。 – dunc

+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