2015-10-23 1 views
0

У меня есть веб-страница, на которой перечислены детали футбольных игроков клуба, их дата рождения и даты, когда они дебютировали в клубе, а также с их возрастом на дебют.Как рассчитать разницу между датами; лимит и сортировка результатов?

Отображаются результаты here.

То, что я хочу сделать, однако и без успеха до сих пор, в конечном счете сортирует эту информацию по дебютным возрастам, а затем ограничивает их, например, тремя младшими дебютантами.

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

Данные поступают из нескольких таблиц, поэтому запрос MySQL был настроен таким образом:

$result = mysql_query("SELECT dateofbirth, firstname, lastname, id FROM playerengine WHERE dateofbirth!='0000-00-00'") or die(mysql_error()); 
$totalRows = mysql_num_rows($result); 

if ($totalRows == 0) 
{ 
     echo ""; 
} 
else 
{ 
     $todaysDate = date("Y-m-d"); 

     while ($row = mysql_fetch_array($result)) 
     { 
       $playerId = $row['3']; 
       echo "<tr>"; 
       echo "<td width='20%'>"; 
       echo "".$row['1'].""; 
       echo "</td>"; 
       echo "<td width='20%'>"; 
       echo "".$row['2'].""; 
       echo "</td>"; 
       echo "<td width='20%'>"; 
       echo "".$row['0'].""; 
       echo "</td>"; 
       $debutDate = mysql_query("SELECT re.date,re.venue,re.comp,re.opponent,re.score,re.ID,ce.ID,ce.name,re.season, mt.ID as matchId FROM resultengine re INNER JOIN matchteam mt ON mt.ID=re.ID INNER JOIN clubengine ce ON re.opponent=ce.ID WHERE (mt.ID1 = '".$playerId."' or mt.ID2 = '".$playerId."' or mt.ID3 = '".$playerId."' or mt.ID4 = '".$playerId."' or mt.ID5 = '".$playerId."' or mt.ID6 = '".$playerId."' or mt.ID7 = '".$playerId."' or mt.ID8 = '".$playerId."' or mt.ID9 = '".$playerId."' or mt.ID10 = '".$playerId."' or mt.ID11 = '".$playerId."' or (ID12='".$playerId."' AND SI12 != 0) or (ID13='".$playerId."' AND SI13 != 0) or (ID14='".$playerId."' AND SI14 != 0) or (ID15='".$playerId."' AND SI15 != 0) or (ID16='".$playerId."' AND SI16 != 0) or (ID17='".$playerId."' AND SI17 != 0) or (ID18='".$playerId."' AND SI18 != 0) AND (mt.ID!='1624') AND (mt.ID!='1638') AND (mt.ID!='225') AND (mt.ID!='248')) GROUP BY re.season ORDER BY re.season ASC LIMIT 1") or die(mysql_error()); 
       $totalRows = mysql_num_rows($debutDate); 
       while ($debutRow = mysql_fetch_array($debutDate)) 
       { 
        echo "<td width='20%'>"; 
        echo "Debut Date: ".$debutRow['0']."<br />vs.".$debutRow['7']; 
        echo "</td>"; 
        echo "<td width='20%'>"; 
        $date1 = new DateTime($row['0']); 
        $date2 = new DateTime($debutRow['0']); 
        $interval = $date1->diff($date2); 
        $years = $interval->format('%Y'); 
        $days = $interval->format('%a') - (int)$years*365; 
        echo "aged ".$years ." years and ". $days." days"; 
        echo "</td>"; 
       } 
       echo "</tr>"; 
     } 
} 

Я знаю, что mysql_ * функции были амортизируется в PHP и будет меняющийся это mysqli_ *, прежде чем все в доработан/put live - но любые указатели, насколько это было в этом возрасте, были бы потрясающими.

+0

Каков ваш ожидаемый выход? показать некоторые образцы. –

+0

Вы пытаетесь определить различия даты в php, было бы проще сделать это в mysql, что-то вроде select * from the players order by debut DESC limit 3, который даст вам набор результатов ты ищешь – Coz

ответ

1

Пожалуйста, взгляните на MySQL date functions. В вашем случае datediff может быть функцией, в которой вы нуждаетесь. e.G. это поможет вам возраст в дни они были на дебюте, заказанные ими

SELECT dateofbirth, firstname, lastname, id, DATEDIFF(dateofdebut, dateofbirth) AS daysOldOnDebut FROM playerengine WHERE dateofbirth!='0000-00-00' ORDER BY daysOldOnDebut 

в то время как

SELECT dateofbirth, firstname, lastname, id, DATEDIFF(dateofdebut, dateofbirth) AS daysOldOnDebut FROM playerengine WHERE dateofbirth!='0000-00-00' ORDER BY dateofdebut 

даст вам возраст в те дни, когда они дебютировали при заказе от (абсолютного) дня дебют.

Вы можете использовать результат функции mysql в PHP, указав ALIAS (select ... AS yourAlias) и использовать этот псевдоним, как если бы это был обычный столбец.

EDIT: вы всегда можете добавить LIMIT 42 к обоим запросам.

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

Смежные вопросы