按天分组的MySQL随机排序

3
能否在同一天内随机获取项目?例如:给定一个表格,我想在同一天内随机选择项目,并按日期降序排列。但是,由于order by rand()无法接受分组,因此不知道如何开始或是否可能实现。以下是示例表:
+----+---------------------+  
| id | md                  |  
+----+---------------------+  
|  1 | 2010-06-27 11:26:01 |  
|  2 | 2010-06-27 11:28:20 |  
|  3 | 2010-06-27 11:29:46 |  
|  4 | 2010-06-27 11:30:50 |  
|  5 | 2010-06-27 12:20:56 |  
|  6 | 2010-06-27 12:27:42 |  
|  7 | 2010-06-27 15:14:05 |  
|  8 | 2010-07-06 01:53:33 |  
|  9 | 2010-07-06 01:52:52 |  
+----+---------------------+  
期望输出为:
+----+---------------------+  
| id | md                  |  
+----+---------------------+  

|  8 | 2010-07-06 01:53:33 |  随机块  
|  9 | 2010-07-06 01:52:52 |  

|  2 | 2010-06-27 11:28:20 |  随机块  
|  4 | 2010-06-27 11:30:50 |  
|  1 | 2010-06-27 11:26:01 |  
|  6 | 2010-06-27 12:27:42 |  
|  3 | 2010-06-27 11:29:46 |  
|  5 | 2010-06-27 12:20:56 |  
|  7 | 2010-06-27 15:14:05 |
+----+---------------------+

你是想每个日期只返回一次吗?看起来你想要每个日期返回多个时间。 - Mike
4个回答

5
非常简单:
SELECT * 
FROM tbl 
ORDER BY md DESC, RAND()

4

可能不是非常高效,但可以尝试

select * from (select * from tbl order by rand()) as t group by date(md)

2
如果我理解您的问题正确,这个应该能够解决问题:
SELECT * FROM table1 ORDER BY DATE(md) DESC, RAND();

例子:

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (
    `id` int(11) NOT NULL auto_increment,
    `md` DATETIME,
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

DELIMITER //
DROP PROCEDURE IF EXISTS autofill//
CREATE PROCEDURE autofill()
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 50 DO
        INSERT INTO table1 (md) VALUES (DATE_ADD(NOW(), INTERVAL FLOOR(RAND() * 1000) HOUR));
        SET i = i + 1;
    END WHILE;
END;
//
DELIMITER ;

CALL autofill();

SELECT * FROM table1 ORDER BY DATE(md) DESC, RAND();

+----+---------------------+
| id | md                  |
+----+---------------------+
|  8 | 2010-08-16 13:46:04 |
| 16 | 2010-08-15 19:46:05 |
| 47 | 2010-08-15 18:46:06 |
| 25 | 2010-08-15 15:46:05 |
| 33 | 2010-08-15 09:46:05 |
|  3 | 2010-08-14 20:46:04 |
| 45 | 2010-08-13 03:46:06 |
| 17 | 2010-08-12 13:46:05 |
| 12 | 2010-08-12 06:46:05 |
|  7 | 2010-08-12 15:46:04 |
| 37 | 2010-08-12 14:46:05 |
| 40 | 2010-08-10 05:46:06 |
| 13 | 2010-08-09 10:46:05 |
|  4 | 2010-08-09 00:46:04 |
|  1 | 2010-08-06 12:46:04 |
| 28 | 2010-08-02 23:46:05 |
| 15 | 2010-08-02 10:46:05 |
|  2 | 2010-08-02 01:46:04 |
| 38 | 2010-07-31 13:46:06 |
| 27 | 2010-07-31 04:46:05 |
| 30 | 2010-07-31 03:46:05 |
| 22 | 2010-07-31 08:46:05 |
| 50 | 2010-07-30 05:46:06 |
| 11 | 2010-07-28 13:46:05 |
| 18 | 2010-07-28 21:46:05 |
| 29 | 2010-07-27 23:46:05 |
| 35 | 2010-07-27 11:46:05 |
|  6 | 2010-07-26 20:46:04 |
| 20 | 2010-07-25 03:46:05 |
| 31 | 2010-07-23 07:46:05 |
| 14 | 2010-07-23 23:46:05 |
| 23 | 2010-07-23 10:46:05 |
| 48 | 2010-07-23 17:46:06 |
| 42 | 2010-07-21 03:46:06 |
| 39 | 2010-07-20 05:46:06 |
| 36 | 2010-07-18 05:46:05 |
| 10 | 2010-07-17 01:46:05 |
| 32 | 2010-07-16 06:46:05 |
|  9 | 2010-07-16 15:46:04 |
| 24 | 2010-07-16 10:46:05 |
| 43 | 2010-07-16 09:46:06 |
|  5 | 2010-07-14 01:46:04 |
| 21 | 2010-07-14 08:46:05 |
| 49 | 2010-07-13 07:46:06 |
| 41 | 2010-07-13 15:46:06 |
| 46 | 2010-07-12 04:46:06 |
| 44 | 2010-07-11 16:46:06 |
| 26 | 2010-07-10 14:46:05 |
| 34 | 2010-07-09 16:46:05 |
| 19 | 2010-07-07 01:46:05 |
+----+---------------------+

谢谢Mike,我在这里尝试了相同的方法,但是有一个问题,rand()函数的参数只是一个种子数,不会影响日期(md)排序。 - Rod
这给了我一个解决问题的想法。选择* from(SELECT * FROM table1 ORDER BY rand())as x order by day(md); - Rod
@Rodrigo:没错 - 只需要从 RAND(TIME(md)) 中移除 TIME(md) 以留下 RAND(),它就可以正常工作了。我一直在重复运行它,每次都会得到不同顺序的结果。@KennyTM:哦是的 - 每次都是相同的结果。 :-( 希望非分组结果是Rodrigo想要的 :-) - Mike

1

你可以使用 WHERE 子句...

WHERE date = 'insert date' ORDER BY rand() LIMIT 1`

然后只需使用PHP将日期插入到每个日期的字符串中。

或者为了只使用一个MySQL查询,可以按日期降序排序并使用PHP将它们全部提取出来...

while ($item = mysql_fetch_array($query)):
    // process to figure out the date (I'm sure you can do that)
    $mydates[$date][] = $id; // add that ID to that date array
endwhile;
foreach ($mydates as $date):
    $key = array_rand($date);
endforeach;

那有帮助,但我每天需要执行一次查询。 - Rod
不过如果你选择第二个选项就不用了。第二个选项只需要按日期排序,然后在 PHP 中进行所有处理,这样实际上会更快。 - animuson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接