MYSQL计算不同数据取决于条件

时间:2018-10-15 11:43:06

标签: mysql sql count distinct

关于数据库查询,我有非常不同的问题。有一些不同的方案:

我有一个包含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个计数+ = 1,等于2个计数-= 1。

2 个答案:

答案 0 :(得分:2)

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

select count(distinct itemId, typeId)
from t;

但是,您确实有一个“孤岛”问题。您正在查看排序来了解发生变化的地方。

如果我相信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))

答案 1 :(得分:0)

尝试以下查询。它使用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