Mysql 在特定时间间隔内的随机结果(根据列数据)
我在MySQL中有这两个表Mysql 在特定时间间隔内的随机结果(根据列数据),mysql,sql,random,distance,Mysql,Sql,Random,Distance,我在MySQL中有这两个表 -“tag\u name”包含每个单独创建的标签的唯一tag\u name\u id,以及相应的标签 -“标记”还包含唯一的标记id、timecode(即时时间)和组id(相同的标记可以具有不同的组id) 现在,我想做的是在前10秒内的某个地方得到一个随机的timecode(timecode),所以我们有一个timecode表,为了便于论证,它可能看起来像这样 CREATE TABLE timecodes(id INT NOT NULL AUTO_INCREMENT
-“tag\u name”包含每个单独创建的标签的唯一
tag\u name\u id
,以及相应的标签
-“标记”还包含唯一的
标记id
、timecode
(即时时间)和组id
(相同的标记可以具有不同的组id)
现在,我想做的是在前10秒内的某个地方得到一个随机的
timecode
(timecode),所以我们有一个timecode表,为了便于论证,它可能看起来像这样
CREATE TABLE timecodes(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,timecode INT NOT NULL);
INSERT INTO timecodes (timecode) VALUES (2),(3),(4),(4),(6),(13),(14),(17),(18),(18),(21),(25),(28),(28);
SELECT * FROM timecodes;
+----+----------+
| id | timecode |
+----+----------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 4 |
| 5 | 6 |
| 6 | 13 |
| 7 | 14 |
| 8 | 17 |
| 9 | 18 |
| 10 | 18 |
| 11 | 21 |
| 12 | 25 |
| 13 | 28 |
| 14 | 28 |
+----+----------+
SELECT @seed := x.timecode
FROM timecodes x
JOIN timecodes y
ON y.id <= x.id
GROUP
BY x.id
HAVING COUNT(*) <= 5
ORDER
BY RAND()
LIMIT 1;
+---------------------+
| @seed := x.timecode |
+---------------------+
| 4 |
+---------------------+
现在,这个问题分为两部分。第一部分涉及从前n个结果中获得随机结果。一种方法(虽然可能不是最快的方法)如下
CREATE TABLE timecodes(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,timecode INT NOT NULL);
INSERT INTO timecodes (timecode) VALUES (2),(3),(4),(4),(6),(13),(14),(17),(18),(18),(21),(25),(28),(28);
SELECT * FROM timecodes;
+----+----------+
| id | timecode |
+----+----------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 4 |
| 5 | 6 |
| 6 | 13 |
| 7 | 14 |
| 8 | 17 |
| 9 | 18 |
| 10 | 18 |
| 11 | 21 |
| 12 | 25 |
| 13 | 28 |
| 14 | 28 |
+----+----------+
SELECT @seed := x.timecode
FROM timecodes x
JOIN timecodes y
ON y.id <= x.id
GROUP
BY x.id
HAVING COUNT(*) <= 5
ORDER
BY RAND()
LIMIT 1;
+---------------------+
| @seed := x.timecode |
+---------------------+
| 4 |
+---------------------+
这可以包含在存储过程中,或者一些应用程序级代码中,上面写着“做第一件事,然后,@seed不为空,做第二件事”——但这超出了我的薪资等级。每秒只有一个“时间码”?是的!所有“时间码”都是以秒为单位插入的……我不是这么说的!现在我很困惑。你想知道你的答案吗第一个结果是前十个条目中的随机结果(即2到18)或前10秒内的随机结果(即2到6?)啊,好吧!现在我明白了,但这不太相关。它可能是前10个条目!这是我数据库的一个示例。我提供的SQL查询返回了前10个结果的随机数。我认为您发布的那个查询返回了相同的结果,但使用了不同的方法。对于第二部分,我需要做的是选择所有结果从上一个查询返回的timecode
开始,间隔3秒或更长时间……”“我想你发布的那个返回的是相同的”不。你的答案是前10秒钟内的结果。不一样。编辑你的原始问题,包括小提琴的链接。是的,你是对的!关于第二部分,你知道怎么做吗?你能帮我一个忙吗?我真的不知道如何及时抓住间隔的结果,考虑到从查询中返回的结果…谢谢。请参见上面的编辑。问题是它是过程性的(迭代)。因此,我认为您需要编写存储过程,或在应用程序级别处理逻辑。我不认为您可以仅使用“内联”变量来实现这一点。
SELECT @seed := MIN(y.timecode)
FROM timecodes x
JOIN timecodes y
ON y.timecode >= x.timecode + 3
WHERE x.timecode = @seed;
1st iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| 13 |
+--------------------------+
2nd iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| 17 |
+--------------------------+
3rd iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| 21 |
+--------------------------+
4th iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| 25 |
+--------------------------+
5th iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| 28 |
+--------------------------+
6th iteration
+--------------------------+
| @seed := MIN(y.timecode) |
+--------------------------+
| NULL |
+--------------------------+