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

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

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 часть, это работает отлично, но с этим это продолжает повторяться.

0

Решение

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

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.

0

Другие решения

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

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

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

Это должно гарантировать, что вы получите значения страны.

0

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector