Показать рейтинг каждого результата в массиве php mysql

Я весь день бился головой о стену из-за этого, я уверен, что делать. Я надеюсь, что это не очень просто, потому что это была борьба для меня! Я искал весь день, надеюсь, кто-то может мне помочь.

У меня есть html-таблица, в которой показаны результаты фитнес-тестов каждого игрока из тренировочного лагеря. Я понял, как отобразить их все вместе с их именем (взято из другой таблицы mysql). Теперь рядом с каждым результатом теста я хочу добавить, как они ранжируются для этого конкретного результата теста. Вот код прямо сейчас за вычетом части фильтрации (я не думаю, что это необходимо для решения этой проблемы):

Запрос базы данных ниже. Он упорядочивает игроков в таблице по позициям, чтобы вся защита отображалась вместе, все нападающие вместе и вратари вместе для удобного просмотра тренером.

//get the camp id for the coach logged in
$getcampid = "SELECT value FROM profile_values WHERE uid = '$user->uid'";   
$campid = mysql_query ($getcampid);
$campidrow = mysql_fetch_array($campid);
$coachescamp = $campidrow[0];

$getplayerdata = mysql_query("SELECT * FROM content_type_test 

INNER JOIN content_type_player ON content_type_test.field_player_uid=
content_type_player.field_uid 

WHERE content_type_test.field_training_camp_nid='$coachescamp' 

ORDER BY content_type_player.field_position_value") or die(mysql_error());

$left = true;
while($playerdata=mysql_fetch_array($getplayerdata))
{

echo "<td>", $playerdata['field_position_value'], "</td>";
echo "<td>", $playerdata['field_last_name_value'],", ",$playerdata['field_first_name_value'], "</td>";
echo "<td>", $playerdata['field_speed_value'], "</td>";
echo "<td>Show rank of players speed compared to other players in $getplayerdata query</td>";
echo "<td>", $playerdata['field_agility_value'], "</td>";
echo "<td>Show rank of players agility compared to other players in $getplayerdata query</td>";
echo"</tr>";
}
echo"</tbody></table>";

Мне нужно показать ранг игроков, скорость и ловкость в столбцах, где написано «показать ранг игроков...». Всего есть еще 5 рангов, которые мне нужно отобразить в этой таблице, которые я не включил, чтобы упростить задачу. Если я смогу понять, как сделать это для этих двоих, я смогу сделать это и для остальных.

Примечание: скорость и ловкость — это числа. Наименьшее число из массива должно занимать первое место.

Спасибо за любую помощь, эти убивали меня.

РЕДАКТИРОВАТЬ -------------------------------------

Вот код, который у меня есть, который возвращает только 1 результат

$getplayerdata = mysql_query("SELECT * FROM content_type_test 

INNER JOIN content_type_player ON content_type_test.field_player_uid=
content_type_player.field_uid 

WHERE content_type_test.field_training_camp_nid='$coachescamp' 

ORDER BY content_type_player.field_position_value") or die(mysql_error());

$left = true;
while($playerdata=mysql_fetch_array($getplayerdata))
{

$arrayOfAllData = array();
while($playerdata=mysql_fetch_array($getplayerdata)){
$arrayOfAllData[$playerdata[ID]] = array(field_position_value =>$playerdata['field_position_value'],
                                      field_last_name_value=>$playerdata['field_last_name_value'], 
                                      field_speed_value=>$playerdata['field_speed_value']);

}

$sql = mysql_query("SELECT @rownum:=@rownum+1 'rank', * FROM content_type_test, (SELECT @rownum:=0) r 
INNER JOIN content_type_player ON content_type_test.field_player_uid=
content_type_player.field_uid 
WHERE content_type_test.field_training_camp_nid='$coachescamp' 
ORDER BY content_type_player.field_speed_value");

while($playerdata=mysql_fetch_array($sql)){
    $arrayOfAllData[$playerdata[ID]]["field_speed_value"] = $playerdata['field_speed_value'];
}

foreach($arrayOfAllData as $player){
   echo "<td>", $player['field_position_value'], "</td>";
   echo "<td>", $player['field_last_name_value'],", ",$player['field_first_name_value'], "</td>";
   echo "<td>", $player['field_speed_value'], "</td>";
   echo "<td>*I dont know what to put here to display the rank*</td>";   
   echo"</tr>";
}
}
echo"</tbody></table>";

При выполнении печати отображается одна строка, подобная этой. Массив ( [] => Массив ( [field_position_value] => Forward [field_last_name_value] => Tester [field_speed_value] => 4.504 ))

Также, как отмечено в одном столбце, я не знаю, что напечатать, чтобы показать ранг.


person Griff    schedule 01.06.2012    source источник


Ответы (2)


ОК, поскольку нет элегантного способа сделать это с помощью 1 запроса MySQL, я бы использовал несколько запросов, объединил их в массив и просмотрел его для ваших результатов. Это немного взломать, но сделает свою работу.

Используйте свой исходный запрос, а затем вместо того, чтобы выполнять цикл и отображать сразу, выполните цикл и поместите в массив:

$arrayOfAllData = array();
while($playerdata=mysql_fetch_array($getplayerdata)){
$arrayOfAllData[$playerdata[ID]] = array(field_position_value =>$playerdata['field_position_value'],
                                          field_last_name_value=>$playerdata['field_last_name_value'], 
                                          field_speed_value=>$playerdata['field_speed_value'])

}

Затем получите следующий запрос MySQL, который будет ранжировать игроков по field_speed_value.

$sql = mysql_query("SELECT @rownum:=@rownum+1 ‘rank’, * FROM content_type_test, (SELECT @rownum:=0) r 
INNER JOIN content_type_player ON content_type_test.field_player_uid=
content_type_player.field_uid 
WHERE content_type_test.field_training_camp_nid='$coachescamp' 
ORDER BY content_type_player.field_speed_value");

Этот запрос добавит рейтинг для каждого игрока, теперь вам нужно добавить этот рейтинг как значение в $arrayOfAllData.

while($playerdata=mysql_fetch_array($sql)){
    $arrayOfAllData[$playerdata[ID]]["field_speed_value"] = $playerdata['field_speed_value']);
}

сделайте новый запрос для каждого рейтинга и добавьте его в свой массив таким же образом. Затем, когда вы все закончите добавлять в массив, вы можете вывести вот так:

foreach($arrayOfAllData as $player){
   echo "<td>", $player['field_position_value'], "</td>";
   echo "<td>", $player['field_last_name_value'],", ",$player['field_first_name_value'], "</td>";
....etc...
}

Надеюсь, это поможет, я устал и ложусь спать, могу уточнить завтра, если у вас возникнут проблемы.

person David Stetler    schedule 01.06.2012
comment
Очень ценю, что вы нашли время. У меня нет возможности попробовать это прямо сейчас, чтобы увидеть, как это работает, но спасибо за ваш ответ. Если у меня получится, я обязательно отмечу это как ответ - person Griff; 02.06.2012
comment
Спасибо, дайте мне знать. Этот код тщательно не тестировался, но он должен работать. Я заметил ошибку, которую я сделал при добавлении данных ранжирования в $arrayOfAllData, так как я сделал это ранее, заменит весь массив, я исправил код, чтобы он добавлял информацию и сохранял то, что там нетронуто. - person David Stetler; 02.06.2012
comment
Наконец-то у меня появилась возможность поиграть с ним, но теперь он возвращает только 1 игрока в таблицу, и я не уверен, какой код мне нужно ввести, чтобы отобразить фактический рейтинг. вечером еще поиграю - person Griff; 05.06.2012
comment
Убедитесь, что вы только объявляете $arrayOfAllData = array(); 1 раз в начале файла. Что произойдет, если вы поместите print_r($arrayOfAllData); в конце файла. Если вы можете опубликовать свой новый код, я могу посмотреть на него и понять, почему вы возвращаете только 1 строку. - person David Stetler; 05.06.2012

РЕДАКТИРОВАТЬ: ИЗВИНИТЕ. Этот запрос будет работать только в SQL Server, а не в MySQL.

вы можете добавить столбцы в свой запрос sql, которые будут иметь рейтинг:

SELECT *, ROW_NUMBER() OVER (ORDER BY field_speed_value) AS field_speed_Ranking,
ROW_NUMBER() OVER (ORDER BY field_agility_value) AS field_agility_Ranking
FROM content_type_test
INNER JOIN content_type_player ON content_type_test.field_player_uid=   
content_type_player.field_uid 
WHERE content_type_test.field_training_camp_nid='$coachescamp' 
ORDER BY content_type_player.field_position_value") or die(mysql_error());

Это даст вам два новых столбца в результатах вашего запроса, field_speed_Ranking и field_agility_Ranking, где каждый игрок ранжируется по порядку. Просто повторите их так же, как и с другими столбцами.

person David Stetler    schedule 01.06.2012
comment
Вы заметили, что OP использует MySQL? - person Pateman; 01.06.2012
comment
В основном я использую SQL Server, не знал, что MySQL не может этого сделать. Напишу новый запрос для MySQL, который делает что-то подобное. Если OP не хочет конвертировать в Windows и установить MS SQL Server??? - person David Stetler; 01.06.2012
comment
Я слышал об обходных путях, но ROW_NUMBER() и OVER() не являются родными. Их может заинтересовать SQL Server, но вопрос помечен mysql, поэтому я полагаю, что они ожидают, что запрос будет работать в MySQL. :) - person Pateman; 01.06.2012