Использование PDO / MySQL для отображения только элементов с идентификатором, который не является другой таблицей с таким же идентификатором - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь получить список для отображения только пользовательских миссий, которые еще не выполнены, у меня есть таблица, настроенная для сбора выполненных пользовательских миссий.Однако я могу только заставить его не отображать только первый или последний результат в результатах выбора идентификатора миссий из таблицы «Завершенные миссии пользователя».

Я пытался использовать подзапросы безрезультатно, пытался использовать различные сокращения и циклы для сбора идентификаторов в массив

$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>";
}

Я пытаюсь выполнить для спискамиссии из daily_missions отображать только на странице результаты / миссии, которые еще не выполнены, и внутри таблицы user_missions_complete.Тем не менее, он не учитывает первый результат или последний результат в результатах запроса.

1 Ответ

0 голосов
/ 15 мая 2019

При этом:

foreach($get as $g) {
    $mID = $g['mID'];
}

вы не выполняете каждый раз выполнение, поэтому вы сохраняете только последний идентификатор, что означает, что:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...