2011-09-05 68 views
1

任何人都可以告訴我是否可以根據每行的重要性獲取mysql條目的列表。比方說,我有一個表中的4個條目(ID,名稱,重要性)。 0 =最高重要性。MySQL根據重要性發生多個元素的結果

id | file  | importance 
---|-----------|----------- 
1 | movie.mp4 | 0 
2 | image.jpg | 1 
3 | movie1.mp4| 2 
4 | movie2.mp4| 2 

要創建一個陣列20個enteries,這是從4個元素populized與結果(實施例5 * movie.mp4,3 * image.jpg的,2 * ...,2 * ... ),但訣竅是元素必須隨機放置在數組中,而不是在彼此之後。

$file[] = movie.mp4; 
$file[] = movie2.mp4; 
$file[] = image.jpg; 
$file[] = movie.mp4; 
$file[] = image.jpg; 
$file[] = movie1.mp4; 
$file[] = movie.mp4; 
$file[] = image.jpg; 
$file[] = movie.mp4; 
$file[] = movie1.mp4; 
$file[] = movie.mp4; 
$file[] = movie2.jpg; 

希望你明白了吧,要不請你:)

+0

請重新表述您的問題標題,它無關,與您所提供 – ajreal

回答

1
SELECT draw_bucket.file 
FROM (
    SELECT row, 
    FLOOR(RAND() * (SELECT SUM(POW(2, 2 - importance)) FROM files)) AS rnd 
    FROM ( 
     (SELECT 1 AS row) UNION (SELECT 2) UNION (SELECT 3) UNION (SELECT 4) UNION 
     (SELECT 5) UNION (SELECT 6) UNION (SELECT 7) UNION (SELECT 8) UNION 
     (SELECT 9) UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12) UNION 
     (SELECT 13) UNION (SELECT 14) UNION (SELECT 15) UNION (SELECT 16) UNION 
     (SELECT 17) UNION (SELECT 18) UNION (SELECT 19) UNION (SELECT 20) 
    ) AS row_nums 
) AS rows 
INNER JOIN (
    SELECT @row := @row + 1 AS row, file 
    FROM ( 
     (SELECT 1 AS cnt) UNION (SELECT 2) UNION (SELECT 3) UNION (SELECT 4) 
    ) AS cnt 
    INNER JOIN files 
    ON(cnt.cnt <= POW(2, 2 - files.importance)) 
    INNER JOIN (SELECT @row := -1) AS INIT 
) AS draw_bucket 
ON(rows.rnd = draw_bucket.row) 

(SELECT 1), (SELECT 2), ...row_nums子查詢應該等於你想要的條目數和cnt子查詢應該等於2^minimumPriority。

您可以通過完成PHP中的大部分工作(例如)來簡化此操作。做一個SELECT *和填補像這樣的數組:

$items = array(
    array('file' => 'movie.mp4', 'importance' => 0), 
    array('file' => 'image.jpg', 'importance' => 1), 
    array('file' => 'movie1.mp4', 'importance' => 2), 
    array('file' => 'movie2.mp4', 'importance' => 2) 
); 

然後做圖中的PHP:

$minImportance = 2; 

$drawBucket = array(); 
foreach($items as $index => $item) { 
    for($i = 0; $i < pow(2, $minImportance - $item['importance']); ++$i) { 
     $drawBucket[] = $index; 
    } 
} 

$output = array(); 
for($i = 0; $i < 20; ++$i) { 
    $randomIndex = mt_rand(0, count($drawBucket) - 1); 
    $output[] = $items[ $drawBucket[$randomIndex] ][ 'file' ]; 
} 

var_dump($output); 
+0

感謝您的描述回覆:) 這會創建數組yes,但是它不會每次都讀取最重要的文件。我們的目標是讓數組中顯示的重要文件比創建數組時更顯眼,並且切換文件,因此同一個文件不會再次出現。 –

+0

@Fløtti它完全符合你的要求,重要的文件更經常顯示,更仔細地看,我們把更多的重要文件放在draw_bucket中,兩個代碼都經過測試。 – nobody

+0

是的,我可以看到在我運行好幾次之後它確實需要重要的文件。現在唯一的問題是要確保它不會打印出相同的文件兩次,例如「元素3和4」。 –

0

我們可以做到這一點用PHP簡單:

<?php 
function cmpf(a,b) 
{ 
    return a['importance'] - b['importance']; 
} 
$arr = array(); 
$res = mysql_query("SELECT * from tbname ORDER BY importance;"); 
$k = 0; 
while ($row = mysql_fetch_assoc($res)) 
{ 
    $arr[$k] = $row; 
    $k++ 
} 
shuffle($arr); 
usort($arr, "cmpf"); 
?>