簡體   English   中英

MySQL,加入多對多關系查詢

[英]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.

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