2010-09-03 30 views
1
id  | name 
-------+------------------------------------- 
209096 | Pharmacy 
204200 | Eyecare Center 
185718 | Duffy PC 
214519 | Shopko 
162225 | Edward Jones 
7609 | Back In Action Chiropractic Center 

我用select id, name from customer order by random()行,而不必重複記錄

有6條,我只想說當過我詢問,我會得到一個唯一的行每次6次,然後從第一或再次啓動記錄每次排序時,頂部不重複

+0

你想選擇6的所有可能的順序嗎?你能澄清你的問題嗎? – 2010-09-03 05:37:42

+1

如果我遵循,你想要做的事實質上就是隨機地列出所有記錄,並且每個查詢都會從列表中獲取下一個項目,直到它耗盡爲止,然後從頭開始重新開始。是對的嗎? – 2010-09-03 05:45:10

+0

如果是這樣,我會建議使用哈希函數,並按MD5(CONCAT('somesalt',id,name))進行排序。排序不會完全是隨機的,但對於大多數目的而言它將足夠接近,並且這樣您就可以使用LIMIT/OFFSET。 (你應該提到什麼數據庫 - MySQL,SQL Server,Oracle,Postgres等 - 你在用你的問題。) – 2010-09-03 05:48:39

回答

0

這會每次給你6個隨機行。如果您的ID不是唯一的主鍵,則Group By將確保唯一的行,因此可能不需要 - 具體取決於您的表結構。

SELECT TOP 6 id, name, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 
FROM customer 
GROUP BY id,name 
ORDER BY [RandomNumber] 

編輯:對不起!沒有正確閱讀這個問題。雖然你可以使用它來每次獲得一個隨機行:)

如果你想要以隨機的順序明確獲取所有6行1,你需要將訂單存儲在某個地方。建議創建臨時表並從那裏選擇,或者如果您正在使用前端網頁,則獲取全部6行並存儲在數據集中。

+0

明白了你的觀點。如果我可以通過sql處理這個問題,而不是製作一個臨時表並執行一些編碼工作,我就會更有自信。 – jawad 2010-09-03 07:17:36

+0

有總是一種方式,不一定是最好的:)看看我的新答案 – JumpingJezza 2010-09-03 07:54:55

0

您可以使用該邏輯, 當前日期的「毫秒」部分始終在變化。我們有一個id列作爲數字。所以我們可以使用模塊化功能來獲得隨機順序:

create table #data(id numeric(10), name varchar(20)) 
insert #data select 209096 , 'Pharmacy' 
insert #data select 204200 , 'Eyecare Center' 
insert #data select 185718 , 'Duffy PC' 
insert #data select 214519 , 'Shopko' 
insert #data select 162225 , 'Edward Jones' 
insert #data select 7609 , 'Back In Action Chiropractic Center' 

select * from #data order by id % (datepart(ms, getdate())) 
0

好吧也許還有另一種方法只是在SQL中。添加一個新的BIT列「選中」。絕對不是最快/最好的表現方式。

DECLARE @id INT 
IF NOT EXISTS (SELECT TOP 1 id FROM customer WHERE selected = 0) 
BEGIN 
    UPDATE customer SET selected = 0 
END 

SELECT @id = id FROM 
(SELECT TOP 1 id, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 
FROM customer WHERE selected = 0 
ORDER BY [RandomNumber]) a 

UPDATE customer SET selected = 1 WHERE id = @id 
SELECT id, name FROM customer WHERE id = @id