我正在尝试获取一个列表,以仅显示尚未完成的用户任务,我有一个表用于收集已完成的用户任务。但是,我只能使它不显示从“用户任务已完成”表中选择任务ID的结果中的第一个或最后一个。
我尝试使用子查询无济于事,尝试使用不同的归约和循环将ID收集到数组中
$db->query("SELECT mID FROM user_missions_complete WHERE userid = ?");
$db->execute([$user_class->id]);
$get = $db->fetch();
foreach($get as $g) {
$mID = $g['mID'];
}
$db->query("SELECT * FROM `daily_missions` WHERE ID != ? ORDER BY `id` ASC");
$db->execute([$mID]);
$m = $db->fetch();
foreach($m as $mis) {
echo "
<tr>
"; if($mis['task_one'] != 'N/A') { echo "
"; } if($mis['task_two'] != 'N/A') { echo "
"; } if($mis['task_three'] != 'N/A') { echo "
"; } if($mis['task_four'] != 'N/A') { echo "
"; } if($mis['task_five'] != 'N/A') { echo "
"; } if($mis['task_six'] != 'N/A') { echo "
"; } if($mis['task_seven'] != 'N/A') { echo "
"; } if($mis['task_eight'] != 'N/A') { echo "
"; } echo "
</tr>";
}
我要完成的任务是,将day_missions中的任务列表仅显示在页面上尚未完成的user / missions_complete表内的结果/任务。但是,它只是不包括查询结果中的第一个结果或最后一个结果。
答案 0 :(得分:0)
与此:
foreach($get as $g) {
$mID = $g['mID'];
}
您并不是每次都执行该操作,因此您只保存了最后一个ID,即:
WHERE ID != ?
仅使用最后一个值(无论结果顺序如何)。
您还使用$db->fetch();
,它仅返回一行。您要使用$db->fetchAll();
我认为您应该能够按照建议在单个查询中执行此操作。您应该使用INNER JOIN
-在不知道您的表结构的情况下,我可能会冒险猜测:
SELECT * FROM daily_missions dm
INNER JOIN user_missions_complete umc ON (dm.id = umc.mID)
WHERE dm.userid = ?
所以最终代码看起来类似于:
$db->query("SELECT * FROM daily_missions dm
INNER JOIN user_missions_complete umc ON (dm.id = umc.mID)
WHERE dm.userid = ?");
$db->execute([$user_class->id]);
$m = $db->fetchAll();
然后您可以遍历整个结果列表。
自然,您需要检查表关系和列名,但这应该可以使您步入正轨。
此外,如果您确实需要根据多个值过滤掉mysql结果,则应使用WHERE IN(
和/或HAVING
子句