2012-06-18 63 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

相關問題