В моем запросе здесь
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
страна 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
повторяется снова, И если снова ссылается, Он исчезает, И снова и снова, Если я удалил Scores
часть, это работает отлично, но с этим это продолжает повторяться.
Вы можете упростить задачу, если сначала создадите сгруппированную структуру в массиве, например так:
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
цикл для печати ваших данных.