【问题标题】:MySQL Left Join Count Activities and return nullMySQL 左连接计数活动并返回 null
【发布时间】:2017-08-16 13:23:23
【问题描述】:

试图让这个mysql 查询工作。

解释:有两张表,一张包含所有带有 org id 列的项目,第二张包含与项目表相关的列 projectid 的所有活动。我想计算活动表中具有用户 ID 并且活动为 1 的所有活动。 但棘手的部分来了,我无法工作。它不会收集活动表中缺少的项目,并以计数 0 显示这些项目。我想显示与 bo 中唯一 projectid 对应的所有项目

SELECT p1.`id` AS projectid ,count(a1.`id`) AS activitiescount ,a1.`userid` AS userid ,p1.`orgid` AS orgid  
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
ON p1.`id`=a1.`projectid` 
WHERE p1.`orgid`=3 
AND a1.`userid` = 26 
AND a1.`active`=1 
OR a1.`id` IS null 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC

给予:

如您所见,例如 6 和 2 是不正确的。 请帮忙。谢谢。

【问题讨论】:

  • 将 Activity 的任何限制移动到加入本身。否则,左连接的行为类似于内连接;空值被消除,因为它们不是用户 ID 26 和活动 1。

标签: mysql


【解决方案1】:

未经测试:

将活动限制移至加入。

此外,通过移动 where 子句来解决该问题,OR 带来的结果也超出了您的预期。

标准方法:

SELECT p1.`id` AS projectid 
     , count(a1.`id`) AS activitiescount 
     , a1.`userid` AS userid 
     , p1.`orgid` AS orgid  
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
  ON p1.`id`=a1.`projectid` 
 AND a1.`userid` = 26 
 AND a1.`active`=1 
WHERE p1.`orgid`=3 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC

您的方法 w/ () 放置正确。

SELECT 
    p1.`id` AS projectid 
    ,count(a1.`id`) AS activitiescount 
    ,a1.`userid` AS userid 
    ,p1.`orgid` AS orgid  

FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 ON p1.`id`=a1.`projectid` 

WHERE p1.`orgid`=3 
  AND ((a1.`userid` = 26 AND a1.`active`=1)  OR a1.`id` IS null) 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC

----更新以模拟每个评论的完全外部连接。

SELECT * 
FROM (
SELECT p1.`id` AS projectid 
     , count(a1.`id`) AS activitiescount 
     , a1.`userid` AS userid 
     , p1.`orgid` AS orgid  
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
  ON p1.`id`=a1.`projectid` 
 AND a1.`userid` = 26 
 AND a1.`active`=1 
WHERE p1.`orgid`=3 
GROUP BY p1.`id` 
UNION  
SELECT p1.`id` AS projectid 
     , count(a1.`id`) AS activitiescount 
     , a1.`userid` AS userid 
     , p1.`orgid` AS orgid  
FROM `projects` AS p1 
RIGHT JOIN `activities` AS a1 
  ON p1.`id`=a1.`projectid` 
 AND p1.`orgid`=3 
WHERE a1.`userid` = 26 
 AND a1.`active`=1 
GROUP BY p1.`id`)
ORDER BY p1.`id`,A1.ID -- assumes A1.ID exists and you want to order in that fashion.

【讨论】:

  • 太棒了!非常感谢,该死的,我一直在努力解决这个问题。现在我学到了一些新的东西,以及如何在未来实现这一目标。谢谢老哥!
  • 使用外连接时,一般来说,只对显示所有记录的表应用限制。左连接的右侧表的限制应该放在连接上,否则连接就像内连接一样。然而,这里没有()的 OR 子句导致了你的大部分问题。
  • 是否可以在活动表中包含项目中为空或未包含的活动?
  • 在其他 RDBMS 系统中,这将通过使用完全外连接而不是左连接来完成。 MySQL 使用联合和子查询来实现这些,因为它不支持完全外连接(现在包括示例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
相关资源
最近更新 更多