代码之家  ›  专栏  ›  技术社区  ›  Rod

MySQL order by rand()按天分组

  •  3
  • Rod  · 技术社区  · 16 年前

    有可能在同一天内得到随机物品吗?

    例如:

    +----+---------------------+  
    | 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 |  random block  
    |  9 | 2010-07-06 01:52:52 |  
    
    |  2 | 2010-06-27 11:28:20 |  random block  
    |  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 |  
    
    +----+---------------------+  
    

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

    4 回复  |  直到 16 年前
        1
  •  4
  •   kennytm    16 年前

    可能效率不高,但试试看

    select * from (select * from tbl order by rand()) as t group by date(md)
    
        2
  •  5
  •   pouya    14 年前

    非常简单:

    SELECT * 
    FROM tbl 
    ORDER BY md DESC, RAND()
    
        3
  •  2
  •   Mike    16 年前

    如果我正确地理解了你的问题,这应该可以做到:

    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 |
    +----+---------------------+
    
        4
  •  1
  •   animuson    16 年前

    你可以用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;
    
    推荐文章