mysql命令由photo_id desc和shuffle之后

时间:2011-06-15 02:15:54

标签: php mysql

我想从表格中选择最近的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且它们之间的关系正确,我猜错了。

有关如何解决此问题的任何提示?也许我的做法根本不好。

最好的问候, 亚历山大

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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 Random Shuffle Array Maintaining Key => Value

答案 2 :(得分: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'];
}