MySQL SELECT与LEFT JOIN& SUM GROUP BY

时间:2016-02-01 12:00:22

标签: mysql join left-join

需要一些帮助mysql选择左连接,我尝试了很多选项,在堆栈上查找答案,但无法解决这个问题。我会感激任何帮助。感谢。

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 JOIN profile_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 

如果需要其他东西,我会添加

4 个答案:

答案 0 :(得分:3)

您的查询看起来很好,加入预聚合数据是个好主意,就像您在这里一样。 (这是一个好习惯,以免错误地将一个表中的聚合与另一个表中的聚合相乘。)

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

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;

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

答案 1 :(得分:0)

为什么SELECT中有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,
      profile_rating.profile_id, 
      SUM(profile_rating.rating) AS rating_sum
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 profile_rating
ON        profile_main.id=profile_rating.profile_id
WHERE     profile_main.user_id=$user_id
AND       profile_main.deleted=0
GROUP BY profile_rating.profile_id

因此,您将总计评分恢复为rating_sum

答案 2 :(得分:0)

你可以尝试以下查询,让我知道是否需要其他东西,以便我可以修改 -

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,
          SUM(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 profile_rating
ON        profile_main.id=profile_rating.profile_id
WHERE     profile_main.user_id=$user_id
AND       profile_main.deleted=0
GROUP BY profile_main.id

答案 3 :(得分:0)

类似的问题已在SO上得到解答。您正在错误的列上执行groupby(不可用),使用表别名,如上面的答案所示。请参考以下链接:

SQL Server Query LEFT JOIN, SUM and GROUP BY and I'm stumped!

Left join, sum and count group by