Loop для выбора одной выделенной строки из всей таблицы, упорядоченной и сгруппированной по соотношению

В моем запросе здесь

SELECT a.FirstName, a.LastName, a.Country, SUM(b.Scores) AS Score FROM names a LEFT JOIN scores b ON a.id = b.id WERE id = :id GROUP BY a.FirstName ORDER BY Score ASC 

Теперь, что я пытаюсь сделать, это получить Distinct country div, Содержит все First/LastNames упорядоченные по их Score

 [id -- FirstName -- LastName -- Country] [1 -- FName1 -- LName1 -- CO1 ] [2 -- FName2 -- LName2 -- CO1 ] [3 -- FName3 -- LName3 -- CO2 ] [4 -- FName4 -- LName4 -- CO3 ] 

получить это так

 CO1: (FName1-LName1,FName2-LName2) CO2: (FName3-LName3) CO3: (FName4-LName4) 

Поэтому я использовал этот цикл, чтобы заставить его работать.

 $pre = null; echo "<div>"; $end = ""; while ($row = $stmt->fetch()) { $FName = $row['FirstName']; $LName = $row['LastName']; $Country = $row['Country']; if ($Country != $pre) { echo $end; echo "<div id='$Country'>$Country:"; echo "<div class='objects'>"; } $end = "</div></div>"; $pre = $Country; echo "<div>($FName - $LName)</div>"; } echo $end; 

Он работает нормально для меня, но когда я обновляюсь, я снова получаю CO1 , И если снова обращается, он исчезает, И снова и снова, Если я удалял часть баллов, он работает отлично, но с этим он продолжает повторяться.

    Вы можете сделать все проще, если сначала создать сгруппированную структуру в массиве, например:

     while ($row = $stmt->fetch()) { $countries[$row['Country']][] = $row; } 

    Теперь в $countries будет одна запись для каждой страны, которая, в свою очередь, будет иметь ряд связанных строк. Затем вы можете создать HTML следующим образом:

     foreach ($countries as $country => $rows) { echo "<div id='$country'>$country\n"; echo " <div class='objects'>\n"; foreach ($rows as $row) { echo " <div>({$row['FirstName']} - {$row['LastName']})</div>\n"; } echo " </div>\n</div>\n"; } 

    Посмотрите, как он работает на eval.in.

    Вы должны правильно использовать GROUP BY .

    Попробуй это:

     GROUP BY a.FirstName, a.LastName, a.Country 

    Это должно обеспечить вам получение ценностей страны.

    Вы можете получить данные в иерархическом структурированном массиве с помощью PDO::fetchAll() с режимом PDO::FETCH_GROUP .

     $data = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); 

    Это будет группировать ваши данные по первому выбранному столбцу. Поэтому вы должны выбрать столбец « Country как первый. Массив должен выглядеть следующим образом:

     $data = [ 'CO1' => [ ['FistName' => 'FName1', 'LastName' => 'LName1', 'Score' => '1'], ['FistName' => 'FName2', 'LastName' => 'LName2', 'Score' => '2'] ], 'CO2' => [ ['FistName' => 'FName3', 'LastName' => 'LName3', 'Score' => '3'] ], 'CO3' => [ ['FistName' => 'FName4', 'LastName' => 'LName4', 'Score' => '4'] ] ]; 

    Теперь вы можете использовать вложенный цикл foreach для печати ваших данных.