我目前有一个查询计算每行的'parent_id'值,并在每行中添加它。
例如,如果我有4条记录在'parent_id'下具有值'1432',那么它将在'count'列下显示计数值4。
我试图根据计数来限制行数。
例如,假设我们想要将每个'parent_id'的记录数超过2.如果'parent_id'已达到第三个记录,它只是传递,它不会返回该记录。
现有表格的示例:
ID parent_id count(parent_id)
1 1234 2
2 1234 2
3 3221 3
4 3221 3
5 3221 3
6 5432 1
7 4312 1
我想得到的结果是:
ID parent_id count(parent_id)
1 1234 2
2 1234 2
3 3221 2
4 3221 2
5 5432 1
6 4312 1
答案 0 :(得分:1)
这是每组选择查询:
SELECT id, parent_id, rn
FROM (
SELECT @rn:=CASE WHEN @parent_id=parent_id
THEN @rn+1
ELSE 1
END AS rn
, @parent_id:=parent_id AS parent_id
, id
FROM t, (SELECT @rn:=0,@parent_id:='') AS u
ORDER BY parent_id,id
) as s
WHERE rn <= 2
答案 1 :(得分:0)
Mihai的回答可能有效,但不能保证有效。问题是MySQL不保证select
中表达式的评估顺序。并且,甚至有时候它没有按照预期的顺序对它们进行评估。
因此,在使用变量时,最安全的做法是将所有赋值放在一个表达式中:
SELECT id, parent_id, rn
FROM (SELECT (@rn := if(@parent_id = parent_id, @rn + 1,
if(@parent_id := parent_id, 1, 1)
)
) as rn,
t.*
FROM t CROSS JOIN
(SELECT @rn := 0, @parent_id := '') params
ORDER BY parent_id, id
) t
WHERE rn <= 2;