У меня есть две таблицы MySQL: опросы и кандидаты. Кандидаты в таблице хранят имена кандидатов и позицию, в которых они соперничают, т.е. кандидатов (имя кандидата, позиция). Таблица опросов хранит каждый опрос, сделанный пользователем во время голосования. Структура таблицы опросов - это опросы (имя кандидата, позиция). Предполагая, что есть только одна должность председателя, а кандидаты - 3; x, y и z. когда пользователь голосует за x, строка в опросах таблицы заполняется значением (x, председатель). предполагая, что будет выпущено 6 бюллетеней, и таблица будет выглядеть следующим образом.
|y | Chairman|
|x | Chairman|
|z | Chairman|
|x | Chairman|
|y | Chairman|
|x | Chairman|
Из этой таблицы я хочу отобразить в ней каждого кандидата и количество голосов, полученных в таблице html. код для этого
$cnameres=mysqli_query($conn,"SELECT candidate_name FROM candidates WHERE Position ='Chairperson'");
while($cname = mysqli_fetch_array($cnameres))
{
$v = $cname['candidate_name'];
//total votes for each candidate
$cand_ballot_count = mysqli_fetch_array(mysqli_query($conn, "SELECT COUNT(Position) FROM polls WHERE Position ='Chairperson' and candidate = '$v'"));
$y = $cand_ballot_count[0] ;
//echo candidate and votes
echo "<tr align='left'>";
echo"<td>" .$v ."</td>";
echo"<td>". $y. "</td>";
}
Результатом будет таблица html, называемая таблицей результатов, которая выглядит так.
| y | 2 |
| x | 3 |
| z | 1 |
Мой вопрос; как я могу сортировать эти данные, чтобы он мог эхо в таблице результатов сортироваться в порядке убывания, как это.
| x | 3 |
| y | 2 |
| z | 1 |
помните, что значение, которое нужно сортировать, отсутствует в базе данных. это только результат подсчета строк.
Вы можете JOIN
к JOIN
запросам в одном, например, ниже
SELECT c.candidate_name, count(*) AS votes
FROM candidates c
JOIN polls p ON c.candidate_name = p.candidate_name
WHERE c.Position = 'Chairperson'
GROUP BY c.candidate_name
ORDER BY votes DESC;
Вот обновленный код
$sql = "
SELECT c.candidate_name, count(*) AS votes
FROM candidates c
JOIN polls p ON c.candidate_name = p.candidate_name
WHERE c.Position = 'Chairperson'
GROUP BY c.candidate_name
ORDER BY votes DESC;
";
$cnameres = mysqli_query($conn, $sql);
while($cname = mysqli_fetch_array($cnameres))
{
$v = $cname['candidate_name'];
//total votes for each candidate
$y = $cname['votes'];
echo "<tr align='left'>";
echo"<td>" .$v ."</td>";
echo"<td>". $y. "</td>";
echo "<tr/>";
}
Вы должны подсчитывать строки в базе данных. Тогда упорядочение тривиально:
SELECT c.candidate_name, COUNT(p.candidate_name) as num_votes
FROM candidate c LEFT JOIN
polls p
ON c.candidate_name = p.candidate_name
WHERE c.Position = 'Chairperson'
GROUP BY c.candidate_name
ORDER BY COUNT(*) DESC;
Я не уверен, что join
необходимо. У вас есть position_name
и position
избыточно в обеих таблицах.