【问题标题】:Mysql query LEFT JOIN unexpected resultMysql查询LEFT JOIN意外结果
【发布时间】:2016-09-10 05:01:24
【问题描述】:

带有左连接的 mysql SELECT 查询没有产生我期望的结果。 我希望有人能告诉我或指出正确的方向,

我正在尝试构建一个查询,从“用户”表中获取所有用户名,然后 从主表中获取他们在特定日期花费的所有时间的总和。我使用了左连接,但没有得到预期的结果。

 SUM(m.time_spent) as sum_total_time
 FROM master as m
  LEFT OUTER JOIN users as u ON u.user_id = m.user_id
   WHERE m.date_created >= '2016-05-09'
  AND m.date_created <= '2016-05-13'
 GROUP BY name
 ORDER BY name

主表

master_id       user_id         time_spent               date_created
1                     1              40                   2016-05-01
2                     2             36                   2016-05-02
3                     3              56                   2016-05-03
4                     2             33                   2016-05-03
5                     1              32                   2016-05-05
nth                 nth       nth number                    nth date

用户表

user_id            first_name            last_name
1                     James                 Green
2                     Robert                 Cox 
3                    Andy                    Roger
etc                   etc                    etc

我希望输出结果应该是这样的:

user_id       Name               sum_total_time

1               James Green          62
2               Robert Cox           69
3               Andy Roger           56
4               Brian Harper         0
5               Angel Lee            0
6               Andrew Martin        55
..... 
.....
Nth Name                             Nth value

【问题讨论】:

  • 你使用WHERE m.date_created &gt;= '2016-05-09' 并且你的 date_created 小于这个日期。还有什么是 AND m.date_created ???条件在哪里?
  • 3 件事:1)左侧的表应该是用户(或者只是将其切换到 RIGHT 连接)和 2)总和需要coalesce(m.time_spent,0) 3)将 where 子句详细信息移动到联接,因为它们需要在联接数据之前应用。
  • 你得到了什么结果?
  • @xObert,事实上,合并不是必需的,NULL 确实会影响 SUM。同样,where 子句和on 子句中的条件具有相同的效果(此外,在内部它们被视为单个条件列表)。不过,RIGHT JOIN 的观点很好。

标签: mysql select join


【解决方案1】:

您必须直接从主表中选择数据,按用户分组并计算总和。然后您可以将此结果与用户表连接以获取有关用户的所有信息。

【讨论】:

  • 我该如何编写查询?
【解决方案2】:

可能是日期转换问题..

 SUM(m.time_spent) as sum_total_time
 FROM master as m
  LEFT OUTER JOIN users as u ON u.user_id = m.user_id
   WHERE m.date_created >=STR_TO_DATE( '2016-05-09', '%Y-%m-%d)

和/或你也有不完整的 sql

SUM(m.time_spent) as sum_total_time
 FROM master as m
  LEFT OUTER JOIN users as u ON u.user_id = m.user_id
   WHERE m.date_created >= '2016-05-09'
  AND m.date_created  // this condition don't match with nothing.. 
                      // could be you forgot a part 

更新 1
如果你想要用户总数,那么

   select u.id,   u.name, SUM(m.time_spent) as sum_total_time
   FROM master as m
   Inner  JOIN users as u ON u.user_id = m.user_id
   WHERE m.date_created >=STR_TO_DATE( '2016-05-09', '%Y-%m-%d)
   AND m.date_created <= =STR_TO_DATE('2016-05-13'', '%Y-%m-%d)
   Group by u.id

【讨论】:

  • 这只会给我匹配的行。我想从用户表中获取所有在主人(sum_total_time)中有值并且没有值(NULL)的用户。
  • 我通过在“LEFT OUTER JOIN ON”上添加条件而不是使用 WHERE 子句解决了这个问题。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多