我有两个选择语句,由UNION ALL
. 在第一个语句中,where 子句仅收集先前已向用户显示的行。第二条语句收集所有未显示给用户的行,因此我首先得到查看的结果,之后得到未查看的结果。
当然,这可以通过使用 simple 的相同 select 语句简单地实现ORDER BY
,但是在您意识到我希望完成的事情之后,两个单独的选择的原因很简单。
考虑以下结构和数据。
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 1 | 1 | 10 | true | .... |
| 2 | 10 | 1 | true | .... |
| 3 | 1 | 10 | true | .... |
| 4 | 6 | 8 | true | .... |
| 5 | 1 | 10 | true | .... |
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
| 13 | 10 | 1 | false | .... |
| 14 | 1 | 10 | false | .... |
| 15 | 6 | 8 | false | .... |
| 16 | 10 | 1 | false | .... |
| 17 | 8 | 6 | false | .... |
| 18 | 3 | 2 | false | .... |
+----+------+-----+--------+------+
基本上,我希望语句选择所有未查看的行,这是通过检查viewed
列是true
or的天气来完成的false
,非常简单明了,这里不用担心。
但是,对于已查看的行,即 column viewed is TRUE
,对于那些记录,我只希望为每个组返回 3 行。
在这种情况下,适当的结果应该是每组中最近的 3 行。
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
+----+------+-----+--------+------+
正如您从理想结果集中看到的那样,我们有三组。因此,查看结果的所需查询应该为它找到的每个分组显示最多 3 行。在这种情况下,这些分组是 10 和 1 和 8 和 6,两者都有三行要显示,而另一组 2 和 3 只显示一行。
请注意, wherefrom = x
和, 与andto = y
进行相同的分组。因此考虑第一个分组(10 和 1),如果是 和 ,则 是同一组。from = y
to = x
from = 10
to = 1
from = 1
to = 10
但是,整个表中有很多组,我只希望在 select 语句中返回每个组中最近的 3 个,这就是我的问题,我不确定如何以最有效的方式完成该表在某个时候将有数百甚至数千条记录。
谢谢你的帮助。
注意:列id
、from
和已编入索引to
,viewed
这应该有助于提高性能。
PS:我不确定如何准确命名这个问题,如果您有更好的主意,请成为我的客人并编辑标题。