2014-02-17 52 views
0

這可能有點混亂,但在這裏裸露。PHP的重量SQL結果

我有一個mysql表,其中我存儲一列(稱爲tickets),並且tickets值可以是任何數字。

我想要做的是有一個MySQL查詢,選擇列中的所有行,按降序對它們進行排序,然後使用PHP來「加權」查詢結果,以便將行最高的tickets值有更高的選擇機會。

這聽起來很混亂。基本上,連續排列的數字越高,被挑選的機會就越大。

有沒有辦法使用程序mysqli來選擇行和PHP來獲得票?所有的輸入都被接受。

+3

mysqli與SQL的執行方式無關 –

+1

我會保留我的衣服,謝謝 – Strawberry

+1

你說什麼「機會」?如果'ORDER BY tickets DESC',則該列中具有最高值的行將首先在結果集中,但「chance」不符合'ORDER BY'子句;) – poncha

回答

0

所以查詢本身不會讓你得到你想要的,這本質上是一個加權隨機選擇。這聽起來像你需要做的是選擇所有的行,並把它們放在一個數字索引的數組中,其中有X個票據的數據行放在X數組中的行數在不同的索引處。然後隨機選擇一個介於0和[ARRAY_SIZE - 1]之間的數字來確定您選擇的行。

所以查詢可能看起來像:

SELECT id, tickets FROM table 

id將表的主鍵。

,代碼可能是這樣的:

// your DB query logic here 
// proceed with following code only if non-empty result set is returned 

// build the array 
$selection_array = array(); 
while($row = /* your DB row fetch mechanism here */) { 
    $temp = array_fill(0, (int)$row['tickets'], $row['id']); 
    $selection_array = array_merge($selection_array, $temp); 
} 

// select value from array 
$random = rand(0, count($selection_array) - 1); 
$selected_id = $selection_array[$random]; 
+0

這與我想要的完全相同,但是從表格中的數千行和數百萬張票據進行過濾有點慢。 – BryanLavinParmenter

+0

@ Kidd396在操作上,這應該採用O(n),其中n是從查詢返回的id的數量。除非您要加入另一個表來確定故障單計數作爲此查詢的一部分,否則故障單數量應該無關緊要。如果你知道你只想限制選擇前100名左右的票數,那麼你肯定可以爲查詢添加一個LIMIT子句(但是這會引入對ORDER BY的需求 - 我試圖跳過這個)。 –

0

嗯,只是一個想法...;)

您可以通過一個隨機乘tickets值...

... ORDER BY tickets*RAND() DESC 

這樣你就可以得到所記錄的訂單,而不是每票所說的票數,而是一個修改後的號碼......

RAND()將爲檢查的每一行返回一個不同的隨機值,但由於原始數字越高,結果的可能性也越高。