关于数据库查询,我有非常不同的问题。有一些不同的方案:
我有一个包含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。
答案 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