mysql按photo_id desc排序,然后进行shuffle


mysql order by photo_id desc and shuffle after

我想从表中选择最近的12行,但随后打乱顺序。

所以我不能使用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,它们之间的关系是正确的,我猜我错了。

关于如何解决这个问题,有什么建议吗?也许我的方法一点都不好。

谨致问候,Alexander

您可以将它们全部放在PHP中的一个数组中,然后用shuffle()随机化该数组的顺序,或者使查询选择最近的12个子查询,然后用外部查询随机化结果。只需先用$items[] = $row;存储项目,然后用shuffle($items)存储项目;并对其进行迭代。您不会在$key中获得$photo_id,但它仍将在$item['photo_id']

PHP的shuffle()函数从数组中删除任何现有键:

注意:此函数为数组中的元素分配新的键。它将删除可能已分配的任何现有关键帧,而不仅仅是重新排序关键帧。

此函数最好用于数字索引数组。一种快速的方法是编写自己的shuffle函数,该函数适用于关联数组。我在之前的Stack Overflow帖子中发现了这个:

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随机乱序数组维护键=>值

您可以使用子查询:

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'];
}