В моем запросе здесь
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
для печати ваших данных.