2010-09-03 74 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