使用PDO / MySQL仅显示ID为非ID的项目是具有相同ID的不同表

时间:2019-05-06 02:35:17

标签: php mysql pdo

我正在尝试获取一个列表,以仅显示尚未完成的用户任务,我有一个表用于收集已完成的用户任务。但是,我只能使它不显示从“用户任务已完成”表中选择任务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表内的结果/任务。但是,它只是不包括查询结果中的第一个结果或最后一个结果。

1 个答案:

答案 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子句