mysql order by photo_id desc and shuffle after

问题描述:

我想从表格中选择最近的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

你可以使用子查询:

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

你可以把他们都在PHP中的数组,然后随机数组的顺序与shuffle(),或作出查询,以选择最近12次的查询,然后用外部查询随机化结果。只需存储$items[] = $row;,然后shuffle($items);并迭代它。你不会得到$key$photo_id,但它仍将是$item['photo_id']

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