MySQL:链接评论的答案,分组和限制

时间:2014-07-21 22:56:04

标签: php mysql

我得到了以下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    |
 +----+--------+------+

我已经尝试了几个小时的几种查询,我可以在没有程序的情况下实现吗?程序会是什么样的?

我非常感谢你的帮助。

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;

fiddle

要选择每种类型的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;

fiddle