我有以下
MySQL表:
+----+--------+------+
| id | answer | type |
+----+--------+------+
>| 1 | -1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 1 |
>| 4 | -1 | 2 |
| 5 | 4 | 2 |
| 6 | 4 | 1 |
>| 7 | -1 | 1 |
| 8 | 7 | 2 |
>| 9 | -1 | 2 |
>| 10 | -1 | 1 |
>| 11 | -1 | 2 |
+----+--------+------+
> = original comment
> answer = -1的条目是原始注释.
>带答案的条目!= -1是具有相应ID的评论的答案.
>此外,还有一些评论类型(在这种情况下为1或2).
现在我想检索原始注释(对于指定的类型和指定的限制)及其答案(类型和限制无关紧要).此外,将结果按两种类型分组会很棒(同样,只有原始注释的类型对分组很重要).
type = 1和limit = 2的查询结果应该类似(尚未分组):
+----+--------+------+
| id | answer | type |
+----+--------+------+
>| 1 | -1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 1 |
>| 7 | -1 | 1 |
| 8 | 7 | 2 |
+----+--------+------+
我现在已经尝试了几种小时的查询,我可以在没有程序的情况下实现它吗?程序会是什么样的?
我非常感谢你的帮助.
最佳答案 使用子查询首先获得类型1的2个原始注释,然后再次加入表以获取原始注释和响应.
select b.*
from (
select id
from answers
where type = 1 and answer = -1
limit 2) a
join answers b on a.id = b.id or a.id = b.answer;
要选择每种类型的2条原始注释,您需要使用用户定义的变量来索引每条原始注释.以下代码将第一个原始注释索引为1,将第二个注释索引为2,依此类推,然后在类型更改时重置为1.最后在最后的where语句中筛选出大于2的索引.
select b.*, a.idx
from (
select id, @idx:=if(@type=a.type,@idx+1,1) idx, @type:=a.type
from (select id, type from answers2 where answer is null order by type) a
join (select @type:=null, @idx:=null) b) a
join answers2 b on a.id = b.id or a.id = b.answer
where a.idx <= 2;