簡體   English   中英

MySQL查詢有兩個連接

[英]MySQL query with two joins

我有查詢我需要在三個鏈表上執行MySQL。 我可以用嵌套查詢做懶惰的方式,但我無法弄清楚如何使用單個查詢來完成它。

表是:

Area:-
 : id     (int)
 : name   (string)

Consultant:-
 :id      (int)
 :active  (1/0)

ConsArea:-
 : areaID        (int)
 : consultantID  (int)

我需要遍歷所有區域(使用$area變量),以便列出所有區域和每個區域以指示“活動”顧問的數量...因此所有區域必須列在其旁邊的值(其中如果沒有相關的活躍顧問,則可以為零)

查詢的第一部分(無論顧問是否活躍)我可以做:

      SELECT areas.name AS aname, COUNT(consAreas.areaID) AS cct 
        FROM areas LEFT OUTER JOIN consAreas 
          ON consAreas.areaID = areas.id 
       WHERE areas.areaID = $area 
    GROUP BY areas.id 
    ORDER BY areas.name

..但是當我想要包括顧問活躍的條件時,我無法確定正確的連接。 它只列出了> 0活躍顧問的區域,而我需要所有區域。

      SELECT areas.name AS aname, COUNT(consAreas.area) AS cct 
        FROM areas LEFT OUTER JOIN consAreas 
          ON consAreas.area = areas.id 
        **JOIN consultants ON consultants.id = consAreas.cons**
       WHERE areas.areaID = $area 
         **AND consultants.active = 1**
    GROUP BY areas.id 
    ORDER BY areas.name

有人幫嗎?

這是因為mysql的行為。 左連接后的內連接使左連接成為內連接。

SELECT areas.name AS aname, COUNT(consultants.id) AS cct 
FROM areas
    LEFT JOIN consAreas ON consAreas.area = areas.id 
    LEFT JOIN consultants ON consultants.id = consAreas.cons AND consultants.active = 1
WHERE 
    areas.areaID = $area 
GROUP BY areas.id 
ORDER BY areas.name

在這里你可以看到我只使用左連接,更重要的是直接從左邊連接ON子句過濾consultants.active狀態。

你想要的是LEFT JOIN (又名左外連接)。

JOIN (實際上是一個內連接)只有在兩個表中都有相應的行時才會選擇JOIN產生的行。 如果左表只有匹配的行,則左連接將選擇行,無論右表是否匹配。

所以在你加入顧問表時:

SELECT areas.name AS aname, COUNT(consAreas.area) AS cct 
FROM areas LEFT OUTER JOIN consAreas 
ON consAreas.area = areas.id 
LEFT JOIN consultants ON consultants.id = consAreas.cons

您需要執行LEFT JOIN並更正GROUP BY 嘗試這個:

SELECT areas.name AS aname, COUNT(consultants.active) AS cct 
    FROM areas 
    LEFT JOIN consAreas 
      ON consAreas.area = areas.id 
    LEFT JOIN consultants 
      ON consultants.id = consAreas.cons
   WHERE areas.areaID = $area 
     AND consultants.active = 1
GROUP BY areas.name
ORDER BY areas.name

這將返回一個表格,其中包含區域名稱和活躍顧問的數量

嘗試這個:

SELECT areas.name AS aname, COUNT(consultants.id) AS cct 
    FROM areas LEFT OUTER JOIN consAreas 
      ON consAreas.areaID = areas.id 
    LEFT OUTER JOIN consultants ON consAreas.consultantID=consultants.id AND consultants.active = 1
   WHERE areas.areaID = $area 
     GROUP BY areas.id 
ORDER BY areas.name

暫無
暫無

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

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