2012-06-18 66 views
1

选择随机N个记录(未顶部)我有以下destinationimagedestination_image表:从每个类别在MySQL

(MYSQL):

  • 目的地:id_destination
  • 图像:id_image ,filePath,size
  • destination_image:id_destination,id_image

我需要选择随机给定尺寸的N幅图像,每个目的地;其中N是在运行时定义的,目标是从id_destination范围中选择的。

我不需要top N图像,只是随机 N图像。

有人能指出我正确的SQL查询是什么吗?

+1

[选择随机行与MySQL]的可能的副本(http://stackoverflow.com/questions/6541644/selecting-random-rows-with-mysql) –

+0

你想要一个特定的大小和目的地和“N”随机?或者...你是否需要“N”个随机条目来提供所有不同的目的地/尺寸......两个完全不同的查询...... – DRapp

+0

我对这里的“随机”一词造成的混淆表示歉意。我想强调一下这样的事实,我不希望这里有'顶部'图像。 (现在编辑这个问题)。 – brainydexter

回答

1

如果你想每个目的地“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个。

希望这可以澄清查询中发生了什么。

+0

感谢您的解释。你能详细介绍一下@vars如何在这里工作吗?(select @lastDestination:= 0, @RandSeq:= 0)SQLVars'?另外,我对此感到抱歉,但我只是在寻找N条记录。随机词造成了很多混乱。看到我对这个问题的评论。 (想强调任何记录,而不是寻找顶级记录) – brainydexter

+0

@brainydexter,请参阅修订以澄清......应该为您解释很多。 – DRapp

+0

感谢您的解释。对此,我真的非常感激。我仍然在消化它。 1问题:这是你如何释放SQL变量:'(select @lastDestination:= 0, @RandSeq:= 0)SQLVars'? – brainydexter

1

尝试类似ORDER BY RAND() LIMIT N其中N是应返回的结果的数量。例如:

SELECT i.id_image FROM image i 
JOIN destination_image di ON i.id_image = di.id_image 
WHERE di.id_destination > N AND di.id_destination < M 
AND i.size = X 
ORDER BY RAND() LIMIT Y 

更换NMXY与你的价值观。

+0

我需要给定大小的每个目的地的N幅图像。我不明白ORDER BY RAND()LIMIT N是如何在这里工作的?你能解释一下吗? – brainydexter

相关问题