[英]MYSQL Left Join Not Showing All Rows
編輯:我清理代碼以下,仍然沒有工作,它仍然只表示在caregiver_review包含匹配行(c.id = cr.practice_id),即使即時通訊使用LEFT JOIN
編輯2:我發現問題是由SELECT子句中的聚合引起的,例如ROUND和COUNT,如果我刪除ROUND和COUNT,則所有行都在視圖表中成功顯示。 我需要使用兩者,我仍然無法找到解決方案,是否有人知道為什么它在使用ROUND&COUNT時改變結果以及我如何能夠正確解決這個問題?
該查詢來自一個名為view_caregiver的視圖(只讀)表,這些是涉及的表:
護理人員
地址
caregiver_review
SELECT `c`.`id` AS `id`,`c`.`user_id` AS `user_id`,`c`.`address_id` AS `address_id`,`c`.`first_name` AS `first_name`,`c`.`last_name` AS `last_name`,`c`.`email` AS `email`,`c`.`phone` AS `phone`,`c`.`status_id` AS `status_id`,`c`.`summary` AS `summary`,`c`.`about` AS `about`,`c`.`business_name` AS `business_name`,`c`.`medical_experience` AS `medical_experience`,`c`.`traveling_distance` AS `traveling_distance`,`c`.`accepting_new_patients` AS `accepting_new_patients`,`a`.`address1` AS `address1`,`a`.`address2` AS `address2`,`a`.`city` AS `city`,`a`.`state_id` AS `address_state`,`a`.`latitude` AS `latitude`,`a`.`longitude` AS `longitude`, COUNT(DISTINCT `cr`.`id`) AS `rating_count`, ROUND((AVG((((`cr`.`rating_knowledge` + `cr`.`rating_personality`) + `cr`.`rating_office`) + `cr`.`rating_timeliness`)) / 2),0) AS `rating`
FROM caregiver AS c
LEFT JOIN address AS a ON (c.address_id = a.id)
LEFT JOIN caregiver_review AS cr ON (c.id = cr.practice_id)
這有效,但它只顯示caregiver_review包含practice_id匹配的行,我希望它顯示來自caregiver表的所有行,即使沒有caregiver_review匹配。 我知道這可以通過LEFT JOIN完成,但我不明白為什么它不起作用!
我認為你遇到的問題是由於在使用聚合函數時缺少GROUP BY。 如果您沒有GROUP BY功能,則不會返回所有數據。
你有兩種方法可以做到這一點。 您可以在子查詢中聚合,在GROUP BY中聚合一列:
SELECT `c`.`id` AS `id`,`c`.`user_id` AS `user_id`,
`c`.`address_id` AS `address_id`,`c`.`first_name` AS `first_name`,
`c`.`last_name` AS `last_name`,`c`.`email` AS `email`,
`c`.`phone` AS `phone`,`c`.`status_id` AS `status_id`,
`c`.`summary` AS `summary`,`c`.`about` AS `about`,
`c`.`business_name` AS `business_name`,
`c`.`medical_experience` AS `medical_experience`,
`c`.`traveling_distance` AS `traveling_distance`,
`c`.`accepting_new_patients` AS `accepting_new_patients`,
`a`.`address1` AS `address1`,`a`.`address2` AS `address2`,
`a`.`city` AS `city`,`a`.`state_id` AS `address_state`,
`a`.`latitude` AS `latitude`,`a`.`longitude` AS `longitude`,
cr.`rating_count`,
cr.`rating`
FROM caregiver AS c
LEFT JOIN address AS a
ON (c.address_id = a.id)
LEFT JOIN
(
select cr.practice_id,
COUNT(DISTINCT `cr`.`id`) AS `rating_count`,
ROUND((AVG((((`cr`.`rating_knowledge` + `cr`.`rating_personality`) + `cr`.`rating_office`) + `cr`.`rating_timeliness`)) / 2),0) AS `rating`
from caregiver_review AS cr
GROUP BY cr.practice_id
) cr
ON (c.id = cr.practice_id)
或者,您可以在原始查詢上進行聚合,並將GROUP BY應用於SELECT列表中未聚合的列:
SELECT `c`.`id` AS `id`,`c`.`user_id` AS `user_id`,
`c`.`address_id` AS `address_id`,`c`.`first_name` AS `first_name`,
`c`.`last_name` AS `last_name`,`c`.`email` AS `email`,
`c`.`phone` AS `phone`,`c`.`status_id` AS `status_id`,
`c`.`summary` AS `summary`,`c`.`about` AS `about`,
`c`.`business_name` AS `business_name`,
`c`.`medical_experience` AS `medical_experience`,
`c`.`traveling_distance` AS `traveling_distance`,
`c`.`accepting_new_patients` AS `accepting_new_patients`,
`a`.`address1` AS `address1`,`a`.`address2` AS `address2`,
`a`.`city` AS `city`,`a`.`state_id` AS `address_state`,
`a`.`latitude` AS `latitude`,`a`.`longitude` AS `longitude`,
COUNT(DISTINCT `cr`.`id`) AS `rating_count`,
ROUND((AVG((((`cr`.`rating_knowledge` + `cr`.`rating_personality`) + `cr`.`rating_office`) + `cr`.`rating_timeliness`)) / 2),0) AS `rating`
FROM caregiver AS c
LEFT JOIN address AS a
ON (c.address_id = a.id)
LEFT JOIN caregiver_review AS cr
ON (c.id = cr.practice_id)
GROUP BY `c`.`id`, `c`.`user_id`, `c`.`address_id`, `c`.`first_name`
, `c`.`last_name`, `c`.`email`, `c`.`phone`, `c`.`status_id`
, `c`.`summary`, `c`.`about`, `c`.`business_name`, `c`.`medical_experience`
, `c`.`traveling_distance`, `c`.`accepting_new_patients`
, `a`.`address1`, `a`.`address2`, `a`.`city`, `a`.`state_id`
, `a`.`latitude`, `a`.`longitude`
你有沒有嘗試過...
select c.id, a.address_id, cr.practice_id
from caregiver as c
left join address as a on ( c.address_id = a.id )
left join caregiver_review as cr on ( c.id = cr.practice_id )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.