【问题标题】:MySQL order by rand() grouped by dayMySQL order by rand() 按天分组
【发布时间】:2010-07-06 18:02:56
【问题描述】:

是否可以在同一天内获得随机物品?

例如:

+----+----------+ |编号 |医学博士 | +----+----------+ | 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 | +----+----------+

我想在同一天挑选随机物品,但同时我希望它按日期顺序排序。像这样的:

+----+----------+ |编号 |医学博士 | +----+----------+ | 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 | +----+----------+

不知道如何开始,也不知道这是否可能,因为 rand() 的 order 不接受分组。

【问题讨论】:

  • 您是否希望每个日期只返回一次?看起来您每个日期都想要多次。

标签: mysql random sql-order-by


【解决方案1】:

真的很简单:

SELECT * 
FROM tbl 
ORDER BY md DESC, RAND()

【讨论】:

    【解决方案2】:

    可能效率不高,但试试

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

    【讨论】:

      【解决方案3】:

      如果我正确理解了您的问题,这应该可以解决问题:

      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) 排序
      • 这给了我一个解决问题的想法 select * from (SELECT * FROM table1 ORDER BY rand()) as x order by day(md);
      • @Rodrigo:没错——只需从RAND(TIME(md)) 中删除TIME(md) 以离开RAND(),它就可以工作。我反复运行它,每次都以不同的顺序得到结果。 @KennyTM:哦,是的 - 每次都是相同的结果。 :-( 让我们希望未分组的结果是罗德里戈所追求的 :-)
      【解决方案4】:

      您可以使用 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;
      

      【讨论】:

      • 这有帮助,但我需要每天查询一次
      • 如果您选择第二个选项,则不会。第二个你只需按日期排序,然后在 PHP 中进行所有处理,这实际上会快得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2012-06-12
      • 2011-02-09
      • 2022-01-23
      相关资源
      最近更新 更多