使用MySQL,通过使用以前写入的数据填充剩余的数据,始终在数据集中包含预期数量的元素

使用MySQL,通过使用以前写入的数据填充剩余的数据,始终在数据集中包含预期数量的元素,mysql,sql,Mysql,Sql,通过用以前写入的数据填充SQL数据集的剩余部分,保持数据插入的顺序,是否可以始终遵守预期的元素数约束?使用MySQL 编辑 在web商店中,我总是希望显示n个元素。我每w秒更新一次show元素,并希望无限循环 例如,使用表myTable: +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | +----+ 差不多 SELECT id FROM myTable WHERE id > 3 ORDER BY id ALWAYS_RETU

通过用以前写入的数据填充SQL数据集的剩余部分,保持数据插入的顺序,是否可以始终遵守预期的元素数约束?使用MySQL

编辑 在web商店中,我总是希望显示n个元素。我每w秒更新一次show元素,并希望无限循环

例如,使用表myTable:

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
差不多

SELECT id FROM myTable WHERE id > 3 ORDER BY id ALWAYS_RETURN_THIS_NUMBER_OF_ELEMENTS 5
将实际返回到总是返回的位置。这个元素的数量不存在

+----+
| id |
+----+
|  4 |
|  5 |
|  4 |
|  5 |
|  4 |
+----+
不,那不是极限的作用。LIMIT子句在聚合、HAVING子句和排序之后作为语句执行的最后一步应用

我无法理解需要您描述的功能类型的用例

后续行动

Gordon Linoff提供的查询将返回指定的结果,只要myTable中至少有一行满足谓词。否则,它将返回零行

下面是Gordon查询的解释输出:

id select_type  table            type  key     rows Extra 
-- ------------ ---------------- ----- ------- ---- -------------------------------
 1 PRIMARY      <derived2>       ALL              5 Using temporary; Using filesort
 1 PRIMARY      <derived3>       ALL              5 Using join buffer
 3 DERIVED                                          No tables used
 4 UNION                                            No tables used
 5 UNION                                            No tables used
 6 UNION                                            No tables used
 7 UNION                                            No tables used
   UNION RESULT <union3,4,5,6,7> ALL 
 2 DERIVED      myTable          range PRIMARY   10 Using where; Using index
如果结果集包含的行数少于五行且多于零行,那么从原始查询中重新处理结果集的效率似乎要高得多。当行数从5行增加到1000行或150000行时,就更奇怪了

从resultset获取多个行副本的代码非常简单:获取行,如果在获取五行或N行之前到达结果集的末尾,则只需将行指针重置回第一行,以便下一次获取将再次返回第一行。例如,在使用mysqli的PHP中,您可以使用:

$result->data_seek(0);
或者,对于仍在使用不推荐的mysql_uu接口的用户:

mysql_data_seek($result,0);
但是,如果只返回五行,那么很可能根本没有遍历结果,并且已经将所有行填充到一个数组中。只需通过数组的开头进行循环

对于不支持滚动光标的MySQL接口,我们只需存储整个结果集并多次处理。使用Perl DBI,使用fetchall_arrayref,使用JDBC(无论如何都要将整个结果集存储在内存中,而不需要对连接进行特殊设置),我们将结果集存储为一个对象

归根结底,压缩这个需求以生成正好五行的结果集并返回到数据库服务器,并且收回行的重复副本和/或在内存中存储行的重复副本似乎是满足用例的错误方式。如果有理由在内存中存储行的重复副本,那么就可以在不从数据库中提取行的重复副本的情况下实现


非常奇怪的是,你说你正在使用/实现一个循环缓冲区,但是你选择不返回到包含少于五行的结果集的开头,而是需要让MySQL返回重复的行。非常非常奇怪。

这是一个非常奇怪的需求。以下是一种方法:

select id
from (SELECT id
      FROM myTable
      WHERE id > 3
      ORDER BY id
      LIMIT 5
     ) t cross join
     (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5
     ) n
order by n.n, id
limit 5;

您可能需要扩展n中的数字列表,以确保您有足够的行来满足最终限制。

我只是编辑我的问题,我只想考虑一些元素。我想在循环缓冲区中使用它。@Pier AlexandreBouchard,如果缓冲区是循环的,两个元素不也是循环的吗?循环缓冲区?你们的意思是像一个圆形的废纸篓?对不起,我的问题不是很清楚。在web商店中,我总是希望显示n个元素。我每n秒更新一次show元素,我想无限期地循环。@Pier Alexandre Bouchard:您的用例听起来更像是一个演示问题,而不是一个数据检索问题;也就是说,MySQL实际上不需要返回N行。如果MySQL返回的行数少于N行,那么只需重复MySQL返回的行数,不管您需要多少次。你不必用这样做的逻辑来打乱查询。这个语句满足的需求有两个词:怪异和怪异。如果你阅读我关于用例的编辑,也许你会更容易回答:使用这样的查询来满足用例确实很奇怪。用例听起来更像是一个演示问题,而不是一个数据检索问题;将检索行的查询弄糟,使其通过重复行精确返回N行,这不是满足用例的正确方法。虽然我发现这个问题非常不寻常,但我看不到任何值得否决的问题。我不明白为什么我的问题会被否决。
select id
from (SELECT id
      FROM myTable
      WHERE id > 3
      ORDER BY id
      LIMIT 5
     ) t cross join
     (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5
     ) n
order by n.n, id
limit 5;