MYSQL左连接未显示所有行

MYSQL左连接未显示所有行,mysql,left-join,Mysql,Left Join,编辑:我将代码清理为以下内容,仍然不起作用它仍然只显示医务人员\u review包含匹配项(c.id=cr.practice\u id)的行,即使我使用左连接 编辑2:我发现问题是由于在SELECT子句中使用了诸如ROUND和COUNT之类的聚合引起的,如果我删除了ROUND和COUNT,则所有行都会成功地显示在视图表中。我需要同时使用这两种方法,但我仍然无法找到解决方案,有人知道为什么在使用ROUND&COUNT时会改变结果,以及我如何纠正这个问题吗 该查询来自一个名为view\u医务人员的视

编辑:我将代码清理为以下内容,仍然不起作用它仍然只显示医务人员\u review包含匹配项(c.id=cr.practice\u id)的行,即使我使用左连接

编辑2:我发现问题是由于在SELECT子句中使用了诸如ROUND和COUNT之类的聚合引起的,如果我删除了ROUND和COUNT,则所有行都会成功地显示在视图表中。我需要同时使用这两种方法,但我仍然无法找到解决方案,有人知道为什么在使用ROUND&COUNT时会改变结果,以及我如何纠正这个问题吗

该查询来自一个名为view\u医务人员的视图(只读)表,这些表涉及:
护理者
地址
护理者回顾

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)
这是可行的,但它只显示医务人员检查包含练习id匹配的行,我希望它显示医务人员检查表中的所有行,即使没有医务人员检查匹配。我知道这可以通过左连接完成,但我不明白为什么它不起作用

你试过

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 )

我认为您遇到的问题是由于在使用聚合函数时缺少GROUP BY。如果没有GROUPBY函数,则不会返回所有数据

你有两种方法可以做到这一点。您可以在子查询中聚合,并按单个列进行分组:

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 `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`

仍然不起作用,尽管我使用了您的示例来帮助清理现有代码。我一辈子都搞不明白为什么它没有显示所有剩下的行。你确定你没有得到所有的吗?是否确实对表和联接运行了计数?是的,我对表和联接都运行了计数,以确认它没有显示所有行。除了您从医务人员表中列出的所有列之外,我不确定您还有哪些其他列。如果这些都是列,您应该使用
选择c.*
进一步压缩代码。这只是一个提示,与回答你的问题无关……我和你和mconlin一样难堪。