2011-06-15 54 views
0

我想從表格中選擇最近的12行,但隨後將順序洗牌。mysql order by photo_id desc and shuffle after

所以我不能使用ORDER BY RAND(),因爲這隻會隨機選擇一些行而不是最近的12行。

我在想這樣的事情,但它沒有工作按計劃進行:

$artig_photos = mysql_query(" 

    SELECT photo_id, photo_name 
    FROM `migo_artig_photos` 
    WHERE (
     photo_deleted=0 AND photo_type=2 
    ) 
    ORDER BY photo_id DESC 
    LIMIT 12; 

"); 

while ($row = mysql_fetch_array($artig_photos)) { 
    $artig_shuffled[$row['photo_id']] = $row['photo_name']; 
} 

shuffle($artig_shuffled); 

後來當我這樣做:

foreach ($artig_shuffled as $key => $value) { 
} 

我預期的關鍵是photo_id和值爲photo_name與他們之間的正確關係,猜測我錯了。

有關如何解決此問題的任何提示?也許我的方法不是很好。

方面的最佳, 亞歷山大

+0

的'shuffle'不保留數組鍵。 – Ryan 2011-06-15 02:25:07

回答

0

你可以使用子查詢:

SELECT * FROM (
    SELECT `migo_artig_photos`.`photo_id`, 
     `migo_artig_photos`.`photo_name` 
    FROM `migo_artig_photos` 
    WHERE `migo_artig_photos`.`photo_deleted` = 0 AND 
     `migo_artig_photos`.`photo_type` = 2 
    ORDER BY photo_id DESC 
    LIMIT 12) `top_12_migo_artig_photos` 
ORDER BY RAND(); 

或者,你可以這樣做:

// To shuffle: 
while ($row = mysql_fetch_array($artig_photos)) 
{ 
    $artig_shuffled[] = $row; 
} 

shuffle($artig_shuffled); 

// To display: 
foreach ($artig_shuffled as $row) 
{ 
    echo $row['photo_id']; 
    echo $row['photo_name']; 
} 
+0

非常感謝你!像魅力一樣工作:) – Alexander 2011-06-15 02:55:48

+0

不客氣! – 2011-06-15 03:22:24

1

你可以把他們都在PHP中的數組,然後隨機數組的順序與shuffle(),或作出查詢,以選擇最近12次的查詢,然後用外部查詢隨機化結果。只需存儲$items[] = $row;,然後shuffle($items);並迭代它。你不會得到$key$photo_id,但它仍將是$item['photo_id']

1

PHP的shuffle()函數刪除您陣列中的任何現有密鑰:

注意:此函數將新鍵分配給數組中的元素。它將刪除可能已分配的所有現有密鑰,而不僅僅是重新排序密鑰。

該函數最適用於數字索引數組。一個快速的方法是隻編寫自己的shuffle函數,用於關聯數組。我發現這是在以前的堆棧溢出後:

function shuffle_assoc($list) { 
    if (!is_array($list)) return $list; 

    $keys = array_keys($list); 
    shuffle($keys); 
    $random = array(); 
    foreach ($keys as $key) { 
    $random[] = $list[$key]; 
    } 
    return $random; 
} 

鏈接到原:

PHP Random Shuffle Array Maintaining Key => Value