我试图让脚本从一个表中随机选择一行,并继续搜索它是否存在于另一个表中。
代码可能会更好地解释
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中存在的一行
答案 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