Я хочу перечислить комментарии из моей базы данных в зависимости от их типа.
В моей базе данных есть три типа комментариев, и я называю их тремя различными запросами.
//01 - Awaiting Comments $query = $handler->prepare("SELECT * FROM comments WHERE confirmed = 0"); $query->execute(); $r = $query->fetchAll(PDO::FETCH_ASSOC); echo "<h1>Awaiting Comments</h1>"; foreach($r as $r_) { echo "<li>r_[title]</li>"; } //02 - Comments waiting for confirmation $query = $handler->prepare("SELECT * FROM comments WHERE confirmed = 2"); $query->execute(); $r = $query->fetchAll(PDO::FETCH_ASSOC); echo "<h1>Comments waiting for confirmation</h1>"; foreach($r as $r_) { echo "<li>r_[title]</li>"; } //03 - Confirmed comments $query = $handler->prepare("SELECT * FROM comments WHERE confirmed = 1"); $query->execute(); $r = $query->fetchAll(PDO::FETCH_ASSOC); echo "<h1>Confirmed Comments</h1>"; foreach($r as $r_) { echo "<li>r_[title]</li>"; }
С моим текущим кодом я получаю вывод, который я хочу:
Awaiting Comments -comment 1 -comment 8 -comment 5 Comments waiting confirmation -comment 9 -comment 4 -comment 2 Confirmed Comments -comment 3 -comment 6 -comment 7
Есть ли способ получить такой же результат с одним запросом вместо трех из них?
PDO немного больше, чем все думают. Например, у этого есть великолепная функция для вас, называемая PDO :: FETCH_GROUP .
Не говоря уже о других небольших улучшениях, которые могут сделать ваш код значительно короче.
$r = $handler->query("SELECT confirmed, c.* FROM comments c")->fetchAll(PDO::FETCH_GROUP);
Это весь код, который вам нужен.
здесь вы сначала выбираете confirmed
поле, а затем указываете PDO на группировку (или «умножение») результатов на основе ее значения.
И теперь вы можете печатать свои комментарии там, где хотите.
// Awaiting Comments foreach($r[0] as $r_) { echo "<li>$r_[title]</li>"; } // Confirmed comments foreach($r[2] as $r_) { echo "<li>$r_[title]</li>"; }
Или, чтобы сделать это в одном цикле
$titles = [ 0 => 'Awaiting Comments', 2 => 'Comments waiting confirmation', 1 => 'Confirmed Comments', ]; foreach ($titles as $code => $title) { echo "<h3>$title</h3>"; foreach($r[$code] as $r_) { echo "<li>$r_[title]</li>"; } }
Да, вы можете использовать и IN
условие:
SELECT * FROM comments WHERE confirmed IN (0, 1, 2)
Затем вы можете прокручивать результаты столько раз, сколько хотите создать вывод.
Вы можете использовать этот синтаксис запроса:
SELECT * FROM comments WHERE (confirmed >= 0 AND confirmed < 3 ) ORDER BY FIELD(confirmed,0,2,1)
Таким образом, у вас есть все строки, отсортированные по вашему желаемому результату.
Если confirmed
поле допускает только 0,1,2 значения, вы можете sempliy следующим образом:
SELECT * FROM comments ORDER BY FIELD(confirmed,0,2,1)
Затем:
while( $row = $query->fetch(PDO::FETCH_ASSOC) ) { if ( $row['confirmed'] == 0 ) { (...) } elseif( $row['confirmed'] == 1 ) { (...) } else { (...) } }
Вы можете сделать: SELECT * FROM comments WHERE confirmed=1 OR confirmed=2 OR confirmed=0
Или использовать IN