从包含已删除记录的表中选择随机行

时间:2016-02-01 10:16:32

标签: php mysql

如果我有一个包含ID为1,3,5的3行的表,因为删除了ID为2和4的行,我该如何确保选择存在的行?

$stmt = $db->prepare("SELECT COUNT(*) FROM table");
$stmt->execute();
$stmt->bind_result($numRows);
$stmt->fetch();
$stmt->close();

$random = mt_rand(1,$numRows);

$stmt = $db->prepare("SELECT link FROM table WHERE id=$random");

这不会选择ID为5的行,也会选择一个不存在的行(2)。

5 个答案:

答案 0 :(得分:2)

如果行数很小(并且您确定它会保持这种状态),则可以使用ORDER BY RAND() (请注意,这会导致大表的性能问题)。

其他方式是先计算有多少行

  

SELECT COUNT(*)AS total FROM table;

然后选择一个随机数

  

$ rand = rand(1,$ total);

并选择具有限制

的行
  

SELECT * FROM table LIMIT $ rand,1;

答案 1 :(得分:0)

你可以使用带有 EXISTS

的SQL语句
SELECT link
FROM table
WHERE EXISTS (SELECT link
              FROM table
              WHERE id = $random);

答案 2 :(得分:0)

如果您只是想要一个随机行并且不关心id,那么您可以使用:

SELECT link FROM table
ORDER BY RAND()
LIMIT 1

对于大量行(10000+),您可能需要实现另一个解决方案,因为此查询可能很慢。 This site有一个很好的解释和替代解决方案

答案 3 :(得分:0)

您可以选择一个,随机排序,如下所示:

SELECT link FROM table ORDER BY RAND() LIMIT 1

<强>更新 你应该对你拥有的不同解决方案进行基准测试,但是我认为这个解决方案可能很好用很多行:

$stmt = $db->prepare("SELECT COUNT(*) FROM table");
$stmt->execute();
$stmt->bind_result($numRows);
$stmt->fetch();
$stmt->close();

$random = mt_rand(1,$numRows);

$stmt = $db->prepare("SELECT link FROM table WHERE id>=$random LIMIT 1");
$stmt->execute();
$stmt->bind_result($link);
if(!$link){
    $stmt = $db->prepare("SELECT link FROM table WHERE id<$random LIMIT 1");
    $stmt->execute();
    $stmt->bind_result($link);
}

答案 4 :(得分:0)

如果您想要遵循您的方法,那么您必须在查询中进行一些更改。

1.) Query one : select id from table. // It will give you array of existing id.

2.) You have to use array_rand(). and use your second query.

示例:

$stmt = $db->prepare("SELECT ID FROM table");
$result = $stmt->fetchAll();
$random = array_rand(array_flip($result), 1);
$stmt = $db->prepare("SELECT link FROM table WHERE id=$random");