2016-02-10 2 views
5

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

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

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

Есть ли способ, чтобы получить тот же результат с одного запроса вместо трех из них?

+0

насчет 'SELECT COUNT (*) FROM комментарии WHERE подтвержденных в (0 , 1,2) GROUP BY подтверждено '? – Mat

ответ

16

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

Да, вы можете использовать и IN условие:

SELECT * FROM comments WHERE confirmed IN (0, 1, 2) 

Затем вы можете перебрать результаты, как столько раз, сколько вы хотите создать выход.

+0

Вы также можете использовать 'SELECT * FROM comments WHERE подтверждено = 0 ИЛИ подтверждено = 1 ИЛИ подтверждено = 2', единственным недостатком является то, что он длиннее. – Tom

+0

с 'ORDER BY', вы также можете сделать меньше циклов после этого, потому что тогда вам нужно всего лишь петля –

+2

Это правильно @Tom, используя' IN', в основном использует 'OR' –

0

Вы можете сделать: SELECT * FROM comments WHERE confirmed=1 OR confirmed=2 OR confirmed=0 Или используйте IN

1

Вы можете использовать этот синтаксис запроса:

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 
    { 
     (...) 
    } 
}