這可能有點混亂,但在這裏裸露。PHP的重量SQL結果
我有一個mysql表,其中我存儲一列(稱爲tickets
),並且tickets
值可以是任何數字。
我想要做的是有一個MySQL查詢,選擇列中的所有行,按降序對它們進行排序,然後使用PHP來「加權」查詢結果,以便將行最高的tickets
值有更高的選擇機會。
這聽起來很混亂。基本上,連續排列的數字越高,被挑選的機會就越大。
有沒有辦法使用程序mysqli來選擇行和PHP來獲得票?所有的輸入都被接受。
這可能有點混亂,但在這裏裸露。PHP的重量SQL結果
我有一個mysql表,其中我存儲一列(稱爲tickets
),並且tickets
值可以是任何數字。
我想要做的是有一個MySQL查詢,選擇列中的所有行,按降序對它們進行排序,然後使用PHP來「加權」查詢結果,以便將行最高的tickets
值有更高的選擇機會。
這聽起來很混亂。基本上,連續排列的數字越高,被挑選的機會就越大。
有沒有辦法使用程序mysqli來選擇行和PHP來獲得票?所有的輸入都被接受。
所以查詢本身不會讓你得到你想要的,這本質上是一個加權隨機選擇。這聽起來像你需要做的是選擇所有的行,並把它們放在一個數字索引的數組中,其中有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];
這與我想要的完全相同,但是從表格中的數千行和數百萬張票據進行過濾有點慢。 – BryanLavinParmenter
@ Kidd396在操作上,這應該採用O(n),其中n是從查詢返回的id的數量。除非您要加入另一個表來確定故障單計數作爲此查詢的一部分,否則故障單數量應該無關緊要。如果你知道你只想限制選擇前100名左右的票數,那麼你肯定可以爲查詢添加一個LIMIT子句(但是這會引入對ORDER BY的需求 - 我試圖跳過這個)。 –
嗯,只是一個想法...;)
您可以通過一個隨機乘tickets
值...
... ORDER BY tickets*RAND() DESC
這樣你就可以得到所記錄的訂單,而不是每票所說的票數,而是一個修改後的號碼......
RAND()
將爲檢查的每一行返回一個不同的隨機值,但由於原始數字越高,結果的可能性也越高。
mysqli與SQL的執行方式無關 –
我會保留我的衣服,謝謝 – Strawberry
你說什麼「機會」?如果'ORDER BY tickets DESC',則該列中具有最高值的行將首先在結果集中,但「chance」不符合'ORDER BY'子句;) – poncha