如果你想每個目的地「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