我需要从 6 个随机记录中提取数据,但我遇到了一些麻烦 [重复]

Posted

技术标签:

【中文标题】我需要从 6 个随机记录中提取数据,但我遇到了一些麻烦 [重复]【英文标题】:I need to pull data from 6 random records but I'm having a bit of trouble [duplicate] 【发布时间】: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 并使用PDO 或MySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is good PDO tutorial。 我不确定您为什么需要查询文件类型才能生成&lt;img&gt; 链接。你只需要文件名。当用户代理下载图像时,Web 服务器应在响应的 Content-Type 标头中报告类型。但是,如果您仍然需要 i,则可以在一个查询中获取文件名并一起键入。您不需要 2 个查询。 @Celada - 请你解释一下我如何在 1 个查询中得到它? @Skiroid 看看filenamefiletype 如何在agam360's answer 中一起查询。但无论如何,我注意到你所说的“文件类型”并不是真正的文件类型:它只是文件名的第二部分,附加到文件名的第一部分加上一个点。为什么不将整个文件名存储在单个数据库列中?按照你的做法,文件名必须包含至少一个点! 【参考方案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 次。 (另外,它自己重复的概率很低)

以上是关于我需要从 6 个随机记录中提取数据,但我遇到了一些麻烦 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从R中的大型.CSV导入和提取随机样本

从 R 中的大型 .CSV 导入和提取随机样本

查询联合查询

如何从networkx图中提取随机节点?

从列表的字典中提取列表,然后附加到数据框

从 grib 天气模型中提取数据