我想从表格中选择最近的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
且它们之间的关系正确,我猜错了。
有关如何解决此问题的任何提示?也许我的做法根本不好。
最好的问候, 亚历山大
答案 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;
}
链接到原文:
答案 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'];
}