do…while循环从数据库中获取一个随机行

nwwlzxa7  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(333)

我试图让脚本从一个表中随机选取一行,并继续搜索它是否存在于另一个表中。
代码可以更好地解释它

do {
    // get a random row from table A
    $search = mysqli_query($db, 'SELECT * FROM `a` ORDER BY RAND() LIMIT 1');

    // get the id
    $row = mysqli_fetch_assoc($search);
    $row_id = $row['id'];

    // check table B to see if the row id exists
    $check = mysqli_query($db, 'SELECT `id` FROM `b` WHERE `item` = "' . $row_id . '" LIMIT 1');
    $result = mysqli_num_rows($check);
} while ($result === 1);

根据我的理解,它应该循环,直到找到表a中存在的歌曲,而不是表b中的歌曲,然后继续,我可以使用 $row_id .
现在可以了,但是每隔一段时间它就会返回表b中的一行

csga3l58

csga3l581#

为什么不运行一个查询,从表中随机获取一行呢 a 表中不存在的 b ? 一般来说,在循环中进行查询是个坏主意,通常可以避免。可能不是最有效的查询,但这应该比在多个查询中循环工作更好。

SELECT a.id
FROM a 
WHERE a.id NOT IN (SELECT b.item FROM b)
ORDER BY RAND()
LIMIT 1

然后像平常一样运行查询,并获取它返回的单行。

w80xi6nr

w80xi6nr2#

如果有一个 LEFT JOIN 查询以查找中的所有歌曲 a 不存在于 b 然后从列表中随机选择一个。还要注意的是,最好选择您真正想要的列,而不是使用 * . 根据您的代码,此查询应该可以工作:

SELECT a.id
FROM a
LEFT JOIN b ON b.item = a.id
WHERE b.id IS NULL
ORDER BY RAND()
LIMIT 1

然后,您可以移除 do 循环并用此代码替换它。请注意,我已经添加了一个检查,实际上有一首歌 a 这在世界上是不存在的 b :

$search = mysqli_query($db, 'SELECT a.id FROM a LEFT JOIN b ON b.item = a.id
                              WHERE b.id IS NULL ORDER BY RAND() LIMIT 1');
// get the id
$row;
if (!$row = mysqli_fetch_assoc($search)) {
    echo "No non-matching songs found!"
    $row_id = 0;
}
else {
    $row_id = $row['id'];
}
a8jjtwal

a8jjtwal3#

不确定你的bug是什么,你的代码看起来不错。我认为你们表格中的数据可能是问题所在。
但是,您应该尝试在一个查询中执行,而不是循环。像这样:

SELECT * FROM `a`
LEFT JOIN `b` ON `a`.`id` = `b`.`item`
WHERE `b`.`item` = NULL
ORDER BY RAND() LIMIT 1

相关问题