执行... while循环以从数据库

时间:2018-10-30 21:42:05

标签: php mysql database do-while

我试图让脚本从一个表中随机选择一行,并继续搜索它是否存在于另一个表中。

代码可能会更好地解释

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中存在的一行

3 个答案:

答案 0 :(得分:3)

使用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'];
}

答案 1 :(得分:2)

为什么不运行一个查询,该查询从表a中不存在的表b获取随机行?通常,循环内的查询不是一个好主意,通常可以避免。可能不是那里最高效的查询,但是它比循环遍历多个查询更好。

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

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

答案 2 :(得分:1)

不确定您的错误是什么,您的代码看起来不错。我认为您表中的数据可能是问题所在。

但是,您应该尝试在一个查询中执行此操作,而不是进行循环。像这样:

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