Как несколько результатов запроса для уменьшения числа запросов?

Я хочу перечислить комментарии из моей базы данных в зависимости от их типа.

В моей базе данных есть три типа комментариев, и я называю их тремя различными запросами.

//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