【问题标题】:MYSQL count distinct datas depends on if conditionMYSQL 计数不同的数据取决于 if 条件
【发布时间】:2018-10-15 11:43:05
【问题描述】:

我对数据库查询有非常不同的问题。有一点不同的场景:

我创建了一个包含 3 列的表。它们有 ID、ItemId、TypeId 列。我需要一个计数查询,它应该将 ItemId 和 TypeId 一起计算,但重复的列除外。例如;

Id   ItemId   TypeId
--   ------   ------
1      1        1    -> count +1
2      1        1    -> ignore
3      1        2    -> count -1
4      1        2    -> ignore
5      1        1    -> count +1

结果数 = 1

最后,如果重复的不同行,计数忽略该行。但是 TypeId 数据针对一个特定的项目发生了变化,它应该增加或减少计数。 TypeId 等于 1 count +=1,等于 2 count -=1。

【问题讨论】:

  • 预期的输出是什么?你的 MySQL 服务器版本是多少?
  • MySQL 版本为 8.0,预期输出为 0 或 1。这取决于同一项目的类型。您可能会在我认为的更新帖子中看到我的期望
  • @SUsta 请检查发布的答案。
  • @MadhurBhaiya 他们没有工作,很抱歉没有回复
  • @SUsta 为什么不工作?检查 DB fiddle 演示。

标签: mysql sql count distinct


【解决方案1】:

在 MySQL 中,您似乎会使用 count(distinct)

select count(distinct itemId, typeId)
from t;

但是,您确实遇到了差距和孤岛问题。您正在查看 ordering 以了解事情的变化。

如果我相信id 没有空白,您可以这样做:

select count(*)
from t left join
     t tprev
     on t.id = tprev.id + 1
where not ((t.itemId, t.typeid) <=> (tprev.itemId, t.prev.id))

【讨论】:

  • 虽然这是了解gaps-and-islands问题的好方法;但我不确定这是否真的解决了 OP 的奇怪要求。如果 typeID = 2,OP 基本上将计数减 1。
  • 不会用SUM(IF(t.TypeId = 2, -1, 1)) 替换COUNT(*) 会起作用吗?
  • @MadhurBhaiya。 . .随意使用您的方法提供解决方案。
【解决方案2】:

尝试以下查询。这雇用了User-defined session variables。它适用于所有情况(包括Id 中的空白):

SELECT 
  SUM(dt.factor) AS total_count  
FROM 
( SELECT 
    @factor := IF(@item = ItemId AND 
                  @type = TypeId, 
                  0, 
                  IF(TypeID = 2, -1, 1)
                 ) AS factor, 
    @item := ItemId, 
    @type := TypeId 
  FROM your_table 
  CROSS JOIN (SELECT @item := 0, 
                     @type := 0, 
                     @factor := 0) AS user_init_vars 
  ORDER BY Id
) AS dt 

DB Fiddle DEMO

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多