使用MySQL,通过使用以前写入的数据填充剩余的数据,始终在数据集中包含预期数量的元素
通过用以前写入的数据填充SQL数据集的剩余部分,保持数据插入的顺序,是否可以始终遵守预期的元素数约束?使用MySQL 编辑 在web商店中,我总是希望显示n个元素。我每w秒更新一次show元素,并希望无限循环 例如,使用表myTable:使用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
+----+
| 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;