我得到了以下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
现在我想检索原始注释(针对指定类型和指定限制)及其答案(类型和限制无关紧要)。此外,将结果按两种类型分组会很棒(同样,只有原始注释的类型对分组很重要)。
type = 1和limit = 2的查询结果应该是这样的(尚未分组):
+----+--------+------+
| id | answer | type |
+----+--------+------+
>| 1 | -1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 1 |
>| 7 | -1 | 1 |
| 8 | 7 | 2 |
+----+--------+------+
我已经尝试了几个小时的几种查询,我可以在没有程序的情况下实现吗?程序会是什么样的?
我非常感谢你的帮助。
答案 0 :(得分:1)
如果您担心过多的数据重复,请将其存储为单独的列,甚至是不同的表。你是在思考它。
答案 1 :(得分:1)
使用子查询首先获得2个类型为1的原始注释,然后再次加入该表以获取原始注释和响应。
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;