Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在特定时间间隔内的随机结果(根据列数据)_Mysql_Sql_Random_Distance - Fatal编程技术网

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

我在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 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 |
+--------------------------+