如果我有一个包含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)。
答案 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");