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