如果你想每个目的地“X”的条目,您可以按MySQL的变量做...像
select
di.id_destination,
di.id_image,
i.filepath,
i.size,
@RandSeq := if(@lastDestination = di.id_destination, @RandSeq +1, 1) as FinalSeq,
@lastDestination := di.id_destination as carryForward
from
destination_image di
join image i
on di.id_image = i.id_image,
(select @lastDestination := 0,
@RandSeq := 0) SQLVars
where
di.id_destination between rangeStart and rangeEnd (or similar criteria for your "range")
having
FinalSeq = 4 (just a sample, but your "N" entries per destination desired)
order by
id_destination,
rand()
这将让4(或“N”在你的情况下)的条目每个目的地。关键的是按顺序排列。按顺序将按此顺序返回记录,然后应用@sql变量。因此,在每个目标上,行将首先被RAND()忽略,但随机在一个单一目标中......并且在下一个目标上相同,然后下一个...然后@vars生成1,2,3等“列”FinalSeq“。 “HAVING”子句限制哪些行允许在最后一行中使用该条件返回条目,因此每个示例只有4条。
SQL的澄清。
的@variables几乎一样做在SQL语句中使用...在线变量(选择@someVar:= someValue中,@anotherVar:= '',@someDateVar:= GETDATE())作为SQLVars。 ..基本上只是创建并初始化变量,这些变量可以针对查询要处理的每一行进行设置,更改和更新......在SQL语句结束时,变量将被释放。有些人预先将它们声明为单独的SET命令,然后运行SQL-Select ..我宁愿将它们串联起来。
现在,它们是如何使用的......它们可以用于跟踪SQL-select语句返回的任何行的几乎任何内容,但是如果您需要某种顺序的东西,则先处理order子句,然后将记录传递给@vars进行处理...所以,想想在程序中设置的@vars。他们按照在SQL命令中处理的顺序设置一个,并且不管最终结果如何,都会像其他类似函数调用一样存储到最终列名中,例如填充,修剪,上层,合并等。假设为了理解,我们有一张表,10行对应1 = A,2 = B,3 = C - - 10 = J。这些是记录的自然顺序,例如自动增量。现在,如果你要通过rand()从表顺序运行查询select *,你可能会得到3-C,9-I,2 = B,7 = G等......这与限制4,只会返回前4个,你就完成了。
现在分别采用记录1-10 = A-J的情况。现在,让我们扩展,让您的多个目的地和尺寸,如“集团” ...
ID Ltr Dest Size
1 A X a
2 B Y a
3 C X a
4 D X a
5 E Y b
6 F X c
7 G Y b
8 H X a
9 I Y a
10 J X b
11 K X a
12 L Y a
13 M X a
14 N Y a
现在,你想要的所有目标的事情,但单一的大小“一”例如......我增加了一些额外的东西。
select * from SampleTable where Size="a" order by rand()
你可以得到所有的“X”的目的地,或“Y(一)”的记载与“X(一)”的记载,或可用其它类似的平衡。但是,不能保证您获得大小为“a”的3个“X”和3个“Y”记录。如果您将ORDER更改为ORDER BY Dest,rand(),则会先放置所有“X”条目,然后是“Y”,这样限制将不起作用...因此,应用我选择的原则,您为了通过目的地和随机的,并应用其中一个尺寸的条款=“A”,你可能会得到...(按目的地,然后再随机...
13 M X a
3 C X a
8 H X a
1 A X a
11 K X a
4 D X a
9 I Y a
14 N Y a
2 B Y a
12 L Y a
现在,应用@variables到混合...只要施加@RandSeq和@lastDestination
@RandSeq:=如果(@lastDestination = di.id_destination,@RandSeq 1,1)作为FinalSeq,@lastDestination:= di.id_destination作为结转
Start Value of
ID Ltr Dest Size @RandSeq @lastDestination FinalSeq carryForward
13 M X a 0 '' 1 X (current record value of dest)
3 C X a 1 X 2 X
8 H X a 2 X 3 X
1 A X a 3 X 4 X
11 K X a 4 X 5 X
4 D X a 5 X 6 X
9 I Y a 6 X 1 Y (change to Y resets counter to 1)
14 N Y a 1 Y 2 Y
2 B Y a 2 Y 3 Y
12 L Y a 3 Y 4 Y
现在,如果您应用“HAVING”子句FinalSeq < = 3,您将获得上面列出的所有行,并且FinalSeq < = 3,并且剩余的目标“X”的4,5,6将被忽略,并且“Y”中的4将被忽略...因此从给定尺寸的每个目的地留下3个。
希望这可以澄清查询中发生了什么。
[选择随机行与MySQL]的可能的副本(http://stackoverflow.com/questions/6541644/selecting-random-rows-with-mysql) –
你想要一个特定的大小和目的地和“N”随机?或者...你是否需要“N”个随机条目来提供所有不同的目的地/尺寸......两个完全不同的查询...... – DRapp
我对这里的“随机”一词造成的混淆表示歉意。我想强调一下这样的事实,我不希望这里有'顶部'图像。 (现在编辑这个问题)。 – brainydexter