【问题标题】:I need to pull data from 6 random records but I'm having a bit of trouble [duplicate]我需要从 6 个随机记录中提取数据,但我遇到了一些麻烦 [重复]
【发布时间】:2012-06-11 17:14:04
【问题描述】:

可能重复:
Doing a while / loop to get 10 random results

我正在创建一个网站,人们可以上传他们拍摄或制作的有趣图片。每次加载主页时,从 MySQL 数据库中随机显示一张图片/记录到页面上。这是通过...完成的。

$filename = mysql_fetch_row(mysql_query("SELECT filename FROM pictures ORDER BY RAND() LIMIT 1"));
echo $filename[0];

这会在页面上回显一个随机图片文件名。类似funny_cat。但是我需要文件类型,以便我可以将图像回显到页面上。像这样……

while ($record = mysql_fetch_array(mysql_query("SELECT * FROM pictures WHERE p='$p'"))) {
    $filetype = $record["filetype"];
}
echo "<img src=\"picture/".$filename[0].".".$filetype."\" />";

一切都很好。

现在这是我正在努力解决的问题。我想在页面上显示 6 个其他随机较小的图片。所以我需要获取 6 条随机记录并为每条记录回显 filenamefiletype。需要考虑的是,由于数据库的设置方式,我只能使用上面使用的技术获取随机记录。我怎么能这样做?

如果您有任何不确定的地方,请说出来,我会尽力解释。另外,请解释您的解决方案。谢谢!! :-)

【问题讨论】:

  • 请不要将mysql_* 函数用于新代码。它们不再维护,社区已经开始deprecation process。看到red box?相反,您应该了解prepared statements 并使用PDOMySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is good PDO tutorial
  • 我不确定您为什么需要查询文件类型才能生成&lt;img&gt; 链接。你只需要文件名。当用户代理下载图像时,Web 服务器应在响应的 Content-Type 标头中报告类型。但是,如果您仍然需要 i,则可以在一个查询中获取文件名并一起键入。您不需要 2 个查询。
  • @Celada - 请你解释一下我如何在 1 个查询中得到它?
  • @Skiroid 看看filenamefiletype 如何在agam360's answer 中一起查询。但无论如何,我注意到你所说的“文件类型”并不是真正的文件类型:它只是文件名的第二部分,附加到文件名的第一部分加上一个点。为什么不将整个文件名存储在单个数据库列中?按照你的做法,文件名必须包含至少一个点!

标签: php mysql


【解决方案1】:

通过将查询的限制更改为 6 来检索随机列表的前 6 个结果。

$result = mysql_query("SELECT filename FROM pictures ORDER BY RAND() LIMIT 6")

然后,可以调用 mysql_fetch_row 6 次,获取全部 6 个文件名。

$filenames = array();
while ($row = mysql_fetch_row($result)) {
    $filesnames[] = $row[0];
}

现在,您拥有全部 6 个文件名,您可以为每个文件名进行图像检索。

【讨论】:

  • -1:虽然这实际上会使 OP 代码快 6 倍,但它仍然会很慢并且随着表中的每个新条目变得越来越慢
  • @tereško 您对提高性能有何建议?
  • 阅读this article 应该解释问题和可能的解决方案(我在类似的主题中写过comment
【解决方案2】:

如果我理解正确,您想“复制”随机提取 6 次。 如果是这样,我会这样做:

for($i = 0; $i < 6; $i++){
   $filename = mysql_fetch_row(mysql_query("SELECT filename,filetype FROM pictures ORDER BY RAND() LIMIT 1"));
   $file =  $filename[0].'.'.$filename[1];
   echo "<img src=\"picture/".$file."\" />";
}

注意: 如果要获取大量数据,请不要使用 rand 函数,而是在 php 中创建一个随机数组并获取相对 id。

编辑:

如果您想要一个检索 6 张不同的随机图片的解决方案(这样它们就不会重复自己),我会这样做:

$arr_ids = array();
    for($i = 0;$i < 6;$i++){
    $fresh_rand = rand()*$db_row_count;//$db_row_count the number of rows in the data base
     for($j=0;$j <count($arr_ids);$j++){
      if($fresh_rand == $arr_ids[$j]){
        $j =0;
         $fresh_rand = rand()*$db_row_count;
      }
     }
     $arr_ids[$i] = $fresh_rand;
    }

然后我将从数据库中获取 $arr_ids 数组中的 id。
我的解决方案很匆忙,所以请原谅我的不良做法,但我希望你明白你需要做什么。

【讨论】:

  • 你可以这样重复结果
  • 重复什么?你在处理 OP 吗?
  • "SELECT filename,filetype FROM pictures ORDER BY RAND() LIMIT 1",同一个文件名可以显示两次
  • 他没有要求那个解决方案,那是另一个故事……我知道他想重复 6 次。 (另外,它自己重复的概率很低)
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2013-01-06
  • 2011-09-25
  • 2021-06-06
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多