[英]MySQL, join many to many relationship query
我有這個查詢:
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
,無論該行在關聯表中是否具有引用,我應使用什么來獲取所有行?
任何幫助將不勝感激!
嘗試使用:
LEFT OUTER JOIN `locations_persons` ...
-編輯
抱歉,我是新來回答這些StackOverflow問題的人,在響應之前沒有給予應有的重視。
您的表結構是經典的“多對多”聯接,因此,如果沒有給定位置的人,那么locations表中將只有位置數據。 這樣,您將需要有一個LEFT OUTER JOIN才能同時進行locations_persons上的聯接以及從locations_persons到person的聯接。
如果您仍然遇到問題,我將創建一個快速的MySQL數據庫並進行測試。.從現在開始,我將繼續這樣做,但是由於我先前的部分錯誤回答,我認為我現在應該更全面地答復。
--Edit2
關於預期的問題:當您離開外部聯接時,任何失敗的聯接(即,左側有行,但右側沒有匹配項)將使右側的表返回所有空值。 在這種情況下,您希望查詢能夠正確處理locations_persons
和返回空值的persons
所有字段。
如果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`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.