【问题标题】:MySQL SELECT with LEFT JOIN & SUM GROUP BYMySQL SELECT 与 LEFT JOIN 和 SUM GROUP BY
【发布时间】:2016-02-01 12:00:21
【问题描述】:

需要一些关于 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 

如果还需要什么,我会补充的

【问题讨论】:

  • 究竟是什么问题,您的联接是否按预期运行?
  • 使用表别名使查询更具可读性。例如。 FROM profile_main AS pm...。然后SELECT pm.id, pm.add_date....
  • 当我运行这个查询时,它返回给我“'字段列表'中的未知列'profile_rating.rating'”
  • 感谢您的所有回答。非常棒! :) 现在这个话题结束了

标签: mysql join left-join


【解决方案1】:

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

但是您访问了不可用的字段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;

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

【讨论】:

  • 非常感谢。这就是我需要的。现在它正在工作。再次感谢
【解决方案2】:

你为什么在SELECTJOIN

只需选择主选择中的字段:

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

【讨论】:

  • 原因是我们不想将评分总和与信息表中的匹配数相乘。您的查询正是这样做的,这会导致总和不正确。无论如何,原始查询会根据 info Record 获得一个结果行,因此将其放入 GROUP BY 将解决问题:GROUP BY profile_main.id, profile_info.id
【解决方案3】:

您可以尝试以下查询,如果需要其他内容,请告诉我,以便我进行修改-

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

【讨论】:

  • 在这个查询中,我只会得到一个配置文件,我需要从profile_main 表中获取所有配置文件,这与该配置文件的评级是否更早无关
  • @RossDubrivny:这将为您提供给定用户的所有活动个人资料......如果没有得到,请分享数据......
  • @Zafar Malik:无论如何,除了没有正确访问 sum 字段之外,原始查询是完美的,而您的查询为您提供了评分总和乘以信息表中的配置文件匹配。这是因为您缺少 GROUP BY 中的信息表,这似乎也是 te OP 所抱怨的(获取记录而不是单独的信息记录。)GROUP BY profile_main.id, profile_info.id
【解决方案4】:

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

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

Left join, sum and count group by

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多