PDO: получить все непроверенные карточки из базы данных

Я пытаюсь получить все карточки из определенной колоды (deck_id), которые находятся на рассмотрении.

Флэш-карта ожидает, когда

  • это не было проверено,
  • next_review не установлена ​​(новая карта) или же
  • next_review <= $today (означает, что карта подлежит проверке).

То, что я сейчас получаю, это результаты разных карточных колод deck_id 1 а также deck_id 2 но я просто хочу получить ожидающие карты из одной колоды (например, deck_id = 1).

Вот что я попробовал:

//Get the untested and ready to review cards from DB
public function getCardSR($deckId)
{

$today = date('Y-m-d');
$notSet = '0000-00-00';

$query = "SELECT tbl_repetition.repetition_id,
tbl_repetition.card_id,
tbl_repetition.deck_id,
tbl_repetition.user_id,
tbl_repetition.status,
tbl_repetition.last_review,
tbl_repetition.eFactor,
tbl_repetition.inter,
tbl_repetition.repetition,
tbl_repetition.grade,
tbl_cards.front,
tbl_cards.back
FROM tbl_repetition
LEFT JOIN tbl_cards
ON tbl_repetition.card_id = tbl_cards.card_id
WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet";

$stmt = $this->conn->prepare($query);
$stmt->bindParam(':deckId', $deckId);
$stmt->bindParam(':today', $today);
$stmt->bindParam(':notSet', $notSet);
$stmt->execute();

$result = $stmt->fetchAll();

return $result;
}

Вот как результаты извлекаются из $result массив:

$repetition_id = $decks->getCardSR($c)[$repetitionCard]  ["repetition_id"];
$eFactor =       $decks->getCardSR($c)[$repetitionCard]["eFactor"];
$card_id =       $decks->getCardSR($c)[$repetitionCard]["card_id"];
$deck_id =       $decks->getCardSR($c)[$repetitionCard]["deck_id"];
$user_id =       $decks->getCardSR($c)[$repetitionCard]["user_id"];
$status =        $decks->getCardSR($c)[$repetitionCard]["status"];
$last_review =   $decks->getCardSR($c)[$repetitionCard]["last_review"];
$inter =         $decks->getCardSR($c)[$repetitionCard]["inter"];
$repetition =    $decks->getCardSR($c)[$repetitionCard]["repetition"];
$grade =         $decks->getCardSR($c)[$repetitionCard]["grade"];
$front =         $decks->getCardSR($c)[$repetitionCard]["front"];
$back =          $decks->getCardSR($c)[$repetitionCard]["back"];

0

Решение

Ваша проблема исходит от Приоритет оператора в вашем WHERE пункт.

Теперь вы делаете это:

WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet

Давайте назовем первое выражение 1, второе 2 и третье 3.

Что означает, что это будет оценено следующим образом:

  1. AND будет оцениваться первым, поэтому он будет делать (1 AND 2)
  2. OR будет оцениваться вторым, поэтому вы получите (1 AND 2) OR 3

Это означает, что вы извлечете все карты из одной колоды, которую нужно просмотреть сегодня, и все карты из всех колод, для которых не установлен обзор …

Чтобы решить эту проблему, вы должны поставить круглые скобки, чтобы сделать OR оценивать в первую очередь:

WHERE tbl_repetition.deck_id = :deckId AND
(tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet)

Таким образом, у вас будет то, что вы хотите

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]