2010-07-06 106 views
3

是否有可能在同一天內獲得隨機項目?MySQL按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 | 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 | 

+----+---------------------+ 

不知道該如何啓動,或者如果這甚至可能,因爲rand()的命令將不接受分組。

+0

你只需要一個時間每返回日期?它看起來好像你想每次約會多次。 – Mike 2010-07-06 19:46:23

回答

3

也許不是很有效,但儘量

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

感謝之前沒有注意到:P – Rodrigo 2010-07-06 19:15:10

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; 
+0

這有幫助,但我需要每天做一個查詢 – Rodrigo 2010-07-06 18:23:52

+0

如果你做第二個選項,則不行。第二個你只是按日期排序,然後在PHP中完成所有的處理,這實際上會更快。 – animuson 2010-07-06 18:48:01

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 | 
+----+---------------------+ 
+0

感謝邁克,我已經在這裏嘗試過,但有一個問題,rand()函數參數是一個剛纔的種子編號,不影響日期(md)排序 – Rodrigo 2010-07-06 19:10:31

+0

第二個查詢(GROUP BY一個)似乎不起作用。 – kennytm 2010-07-06 19:12:18

+0

這給了我一個想法,解決了這個問題 select * from(SELECT * FROM table1 ORDER BY rand())as x order by day(md); – Rodrigo 2010-07-06 19:14:32

5

很簡單:

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