【问题标题】:MySQL count() with LEFT JOINMySQL count() 与 LEFT JOIN
【发布时间】:2019-04-25 09:35:13
【问题描述】:

许多问题都被问到同样的问题。但先听我说完。 我有两个使用LEFT JOIN 连接的表,第一个表是用户表,第二个表只是参考表划分表

用户表

 user_id |  name   |   division_id
 0       |  ABC    |     0
 1       |  DEF    |     1
 2       |  GHI    |     1

分区表

id  |  name   | protect class
1   |  div_1  |      1

我的原始查询

SELECT count(usr.user_id) 
FROM user as usr 
    LEFT JOIN division as dv 
        ON dv.id = usr.division_id
WHERE 
    dv.protect_class != '1'

但是当我想选择没有划分的用户时

SELECT count(usr.user_id) 
    FROM m_users as usr 
        LEFT JOIN m_division as dv 
            ON dv.id = usr.division_id OR  usr.division_id = '0'
    WHERE 
         dv.protect_class != '1'

事情有点奇怪,没有 division_id 或等于 0 的用户会根据获得的部门条目数被计算多次。

我也尝试添加不同的

SELECT distinct count(usr.user_id)
    FROM m_users as usr 
        LEFT JOIN m_division as dv 
            ON dv.id = usr.division_id OR usr.division_id = '0'
    WHERE 
        dv.protect_class != '1'

但我仍然没有运气。 当我查询这个

SELECT distinct usr.*
    FROM m_users as usr 
        LEFT JOIN m_division as dv 
            ON dv.id = usr.division_id OR usr.division_id = '0'
    WHERE 
        dv.protect_class != '1'

并以物理方式(手动)计数,计数是正确的,然后如果我应用 count() 函数,计数是错误的。所以我只是想请教一下, 如何在不计算我的LEFT JOIN 中的重复项的情况下计算条目?

【问题讨论】:

  • 更新您的问题并添加适当的数据样本..
  • 一个简单的样本数据就足够了吗?
  • 是一个简单的数据集,用于检查您为多个查询获得的行为
  • 我不明白你为什么使用这个OR usr.division_id = '0'
  • @A.Marwan 假设这是我正在做的事情所必需的

标签: mysql


【解决方案1】:

你可以试试下面 - count(distinct usr.user_id)

SELECT count(distinct  usr.user_id)
    FROM m_users as usr 
        LEFT JOIN m_division as dv 
            ON dv.id = usr.division_id OR usr.division_id = '0'
    WHERE 
        dv.protect_class != '1'

【讨论】:

  • 哇,真快,谢谢它的工作原理,我不知道 distinct 可以用作 count() 中的参数
【解决方案2】:

用'OR'连接它会在匹配条件时导致多个连接

SELECT count(usr.user_id) 
    FROM m_users as usr 
    LEFT JOIN m_division as dv 
         ON dv.id = usr.division_id
    WHERE 
         dv.protect_class != '1'
         and (usr.division_id = '0' OR usr.division_id IS NULL)

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2020-05-17
    • 1970-01-01
    • 2021-11-03
    • 2019-07-21
    • 1970-01-01
    • 2019-04-23
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多