2017-07-26 72 views
0

我有這個疑問:MySQL中,加入多對多的關係查詢

SELECT 
    GROUP_CONCAT(DISTINCT 
     `persons`.`name`, 
     '[START_Name_END]', 
     `persons`.`id`, 
     '[START_Id_END]', 
     `persons`.`isteacher`, 
     '[START_IsTeacher_END]' 
    SEPARATOR '[START_ROWSEPERATOR_END]') AS persons_values, 
    `locations`.`name` AS locations_name, 
    `locations`.`id` AS locations_id 
FROM `locations` 
INNER JOIN `locations_persons` ON `locations_persons`.`location_id` = `locations`.`id` 
INNER JOIN `persons` ON `persons`.`id` = `locations_persons`.`person_id` 
GROUP BY `locations`.`id` 
ORDER BY `locations`.`id` 

之所以我用GROUP_CONCAT是擺脫persons表中的所有行,有在關聯表的參考,在同一列

我使用[START_Name_END], [START_Id_END]稍後在我的代碼和[START_ROWSEPERATOR_END]中拆分結果以確定它是同一行還是新的。

一切都工作得很好至今。

事情是如果locations表中的任何一行沒有引用persons表中的任何一行,我沒有在結果中獲得該行!

我認爲問題出在JOIN,我應該用什麼來提取所有行,而不管該行是否在關聯表中有引用?

任何幫助將不勝感激!

+1

請在您的查詢中添加換行符 –

+1

您的代碼無法讀取。請格式正確。可能試試'LEFT JOIN'。 – Eric

+0

我做到了,希望現在它更具可讀性! 傑夫的解決方案的工作,但我只是想知道它是否會導致在另一個場景中 – Niroda

回答

1

使用try:

LEFT OUTER JOIN `locations_persons` ... 

- 編輯

對不起,我是新在回答這些東西的StackOverflow並沒有給這種關注,它響應之前值得。

你的表結構是一個典型的多到多加入,因此,如果沒有人對一個給定的位置,那麼就只能在位置表中的位置數據。因此,您需要有一個LEFT OUTER JOIN,用於加入locations_persons和從locations_persons加入到人員。

如果你還是有問題,我會創建一個快速的MySQL數據庫和測試的事情了。我會做,從現在開始,但認爲我應該的,因爲我的壞部分回答剛纔的答覆更充分了。

--Edit2

關於預期的問題:當你左外連接,任何連接失敗(即有左側行,但右側不匹配),將擁有返回正確的表所有的空值。在這種情況下,你會希望你的查詢,妥善處理各方面的locations_personspersons返回空值。 。

如果GROUP_CONCAT對此並不很好地處理(我不熟悉),你可能需要包裝這些人*場在IFNULL,如果您有任何問題:

SELECT 
    GROUP_CONCAT(
    DISTINCT `persons`.`name`, 
    '[START_Name_END]', 
    IFNULL(`persons`.`id`, ''), 
    '[START_Id_END]', 
    IFNULL(`persons`.`isteacher`, ''), 
    '[START_IsTeacher_END]' SEPARATOR '[START_ROWSEPERATOR_END]' 
) AS persons_values, 
    `locations`.`name` AS locations_name, 
    `locations`.`id` AS locations_id 
FROM 
    `locations` 
    LEFT OUTER JOIN `locations_persons` ON 
    `locations_persons`.`location_id` = `locations`.`id` 
    LEFT OUTER JOIN `persons` ON 
    `persons`.`id` = `locations_persons`.`person_id` 
GROUP BY 
    `locations`.`id` 
ORDER BY 
    `locations`.`id` 
+0

不幸的是同樣的問題! – Niroda

+0

你正在使用兩個INNER JOINs,有沒有可能是來自PERSONS的一個缺少的條目也抑制了事情?是否使用LEFT OUTER JOIN雙方你的加入解決的事情嗎? 如果沒有,你可以張貼一些表定義,並用樣本數據的插入,與預期的結果一起? 你有沒有WHERE子句在這裏,所以連接是唯一可能的地方數據LEFT OUTER JOIN將包含連接左側的所有行,並使用NULL值作爲缺少右側的字段。 –

+0

謝謝傑夫!它確實! 我現在的排隊是,將左側外側JOIN導致任何問題? – Niroda