【问题标题】:How can I make sure that two rows selected at random are different from one another?如何确保随机选择的两行彼此不同?
【发布时间】:2015-05-08 10:36:26
【问题描述】:

我有一张桌子photos,里面有很多照片,我需要随机选择两张:

getnew.php

$result = mysqli_query($conn,"SELECT * FROM photos ORDER BY rand() LIMIT 1");
$result2 = mysqli_query($conn,"SELECT * FROM photos ORDER BY rand() LIMIT 1");

  $row = $result->fetch_assoc();
  $img1link = $row['link'];
  // more stuff from $row

  $row2 = $result2->fetch_assoc();
  $img2link = $row2['link'];
  // more stuff from $row2

但是我需要防止它两次选择同一张照片(选择的照片必须不同),即$img1link不应该= $img2link。然后我需要在另一个文件中使用$.getJSON 检索数据,使用getnew.php 末尾的数组。

getnew.php 末尾的数组:

echo json_encode(array('img1'=>$img1link,'img2'=>$img2link, ...(etc)... ));

当变量存储在数组中时,如何确保所选照片有所不同?我试图创建一个 if/else 语句,但并不真正理解我在做什么。

【问题讨论】:

  • 我只是好奇...你为什么认为 LIMIT 2 会失败?
  • 我是一个初学者,对 PHP/MySQL 的理解很差,我使用的许多代码都是从 StackOverflow 的答案中复制并适应我自己的,但我没有得到还没有完全理解它们。
  • @frosty 我发现mysqltutorial.org 和官方文档dev.mysql.com/doc 对我最有帮助,并且尽可能多地阅读 Stack Overflow / 书籍。祝你好运。

标签: php mysql


【解决方案1】:

您可以只执行一次,然后执行两次,这样您就永远不会选择同一行:

$result = mysqli_query($conn,"SELECT * FROM photos ORDER BY rand() LIMIT 2");
$row = $result->fetch_assoc();
$row2 = $result->fetch_assoc();
// invoke `->fetch` twice to get the first and second row
$img1link = $row['link'];
$img2link = $row2['link'];

旁注:注意ORDER BY rand() 子句,因为它在大型数据集上会很慢。您可以使用@Bill Karwin 的 answer 替代方案@

【讨论】:

  • 只是好奇,因为我没有意识到 ORDER BY rand() 会导致大表出现问题,我怎样才能让他的答案适应我自己的问题?看起来有点难以理解。谢谢
  • @frosty 很高兴这对您有所帮助,实际上您可以将其添加到此答案中,应用非常简单,先获取计数,然后将其应用于当前查询。
  • 我是编码新手,所以我很抱歉,你能用他的方法编辑你的答案并将其与我的联系起来吗?如果人们遇到我的问题,它也可能会有所帮助,因为 ORDER BY rand() 通常不应该使用
【解决方案2】:

运行单个查询 -

 $result1 = mysqli_query($conn,"SELECT * FROM photos ORDER BY rand() LIMIT 2");

  while($row = $result->fetch_assoc()) {
      $imglink[] = $row['link'];
  }

你会得到$imglink[]数组中的链接。

【讨论】:

  • 哇,明白了,tnx .. :)
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2015-04-07
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多