带有 LEFT JOIN 和 SUM GROUP BY 的 MySQL SELECT

标签 mysql join left-join

需要一些关于 mysql select with left join 的帮助,我尝试了很多选项,在堆栈中查找答案,但无法解决这个问题。我将不胜感激任何帮助。谢谢。

SELECT    profile_main.id,
          profile_main.add_date,
          profile_main.expire_date,
          profile_main.status_begin,
          profile_main.status_expire,
          profile_main.views,
          profile_main.last,
          profile_main.confirm,
          profile_info.name,
          profile_contacts.remains,
          profile_rating.rating
FROM      profile_main
LEFT JOIN profile_info
ON        profile_main.id=profile_info.profile_id
LEFT JOIN profile_contacts
ON        profile_main.id=profile_contacts.profile_id
LEFT JOIN (
   SELECT profile_rating.profile_id, SUM(profile_rating.rating)
   FROM   profile_rating
GROUP BY  profile_rating.profile_id
          ) profile_rating
ON        profile_main.id=profile_rating.profile_id
WHERE     profile_main.user_id=$user_id
AND       profile_main.deleted=0

问题是 LEFT JOINprofile_rating。我需要 SUM(profile_rating.rating)

这里是 profile_main 表。表什么保存所有配置文件 enter image description here

这里是 profile_rating 表。 [编辑] 此表可能不包含所有个人资料评级,仅包含较早评级的个人资料

id profile_id user_id rating ip_addr         add_date  deleted
--------------------------------------------------------------
 1         16       5     15 111.111.111.111 123432433       0
 2         16       5     17 111.111.111.111 123432433       0
 3         16       5     25 111.111.111.111 123432433       0 
 4         16       5     34 111.111.111.111 123432433       0 
 5         16       5     12 111.111.111.111 123432433       0 

如果还需要什么,我再补充

最佳答案

您的查询看起来不错,加入预先聚合的数据是个好主意,就像您在此处所做的那样。 (一个好习惯,以免错误地将一张表中的聚合与另一张表中的匹配项相乘。)

但是您访问字段 profile_rating.rating,该字段不可用,因为您不再处理单个记录值,而是总和。为总和创建一个别名:SUM(rating) AS sum_rating 并在您的选择子句中使用它。

SELECT
  m.id,
  m.add_date,
  m.expire_date,
  m.status_begin,
  m.status_expire,
  m.views,
  m.last,
  m.confirm,
  i.name,
  c.remains,
  r.sum_rating
FROM profile_main m
LEFT JOIN profile_info i ON m.id = i.profile_id
LEFT JOIN profile_contacts c ON m.id = c.profile_id
LEFT JOIN 
(
  SELECT 
    profile_id, 
    SUM(rating) AS sum_rating
  FROM profile_rating
  GROUP BY profile_id
) r ON m.id = r.profile_id
WHERE m.user_id = $user_id
AND m.deleted = 0;

我还使用表别名来增强可读性。

关于带有 LEFT JOIN 和 SUM GROUP BY 的 MySQL SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130018/

相关文章:

php - 从 mysql 中选择 PHP Switch 大小写值

java - 如何使用jsp将html代码存储在字符串中

添加 ORDER BY 时 MySQL 查询崩溃,否则工作正常

mysql - SQL : Outer Joins with one-to-many relationships

PHP MySQL LEFT JOIN 不工作

mysql - 使用 sum select 连接 mySQL 表

mysql - 使用多表左连接插入时在单个表中插入重复行

PHP 找不到 mySQL 数据库

mysql - 我如何声明 mysql 列表变量

mysql - 使用 MYSQL 连接两个查询并处理日期