GROUP BY с последней датой

Freakmeister

Новичок
GROUP BY с последней датой

Есть табличка: http://red-squadron.ru/index.php?ind=stats
Всё её содержимое хранится в одной таблице БД, в таком виде:


Код таков:
PHP:
$output = "
<tr>
<td>
<table width='100%' border='1' cellpadding='0' cellspacing='0'>
  <tr>
    <td align='center' bgcolor='#E9E9E9'>Score</td>
    <td align='center' bgcolor='#E9E9E9'>Имя</td>
    <td align='center' bgcolor='#E9E9E9'>R</td>
    <td align='center' bgcolor='#E9E9E9'>Убийств</td>
    <td align='center' bgcolor='#E9E9E9'>Онлайн</td>
    <td align='center' bgcolor='#E9E9E9'>Updated</td>
  </tr>
"; 

if ($mkportals->input['ide'] == "") {
        $DB->query( "SELECT * FROM mkp_stats GROUP BY name ORDER BY date");
} else {
        $ids = $mkportals->input['ide'];
        $DB->query( "SELECT * FROM mkp_stats WHERE ide=$ids AND status=0 ORDER BY date");
}
        while( $row = $DB->fetch_row($query) ) {
                $id = $row['id'];
                $ide = $row['ide'];
                $name = $row['name'];
                $r = $row['r'];
                $kills = $row['kills'];
                $online = $row['online'];
                $date = $row['date'];
                $score=$r+$kills;
                
$output .= "
  <tr>
    <td>$score</td>
    <td><a href='index.php?ind=stats&ide=$ide'>$name</a></td>
    <td>$n</td>
    <td>$kills</td>
    <td>$online</td>
    <td>$date</td>
  </tr>
";
        }
$output .= "
  </tr>
</table>
</td>
</tr>";
У Dr. Manhattan здесь есть 3 записи, в корне таблицы выдаётся первая попавшаяся за счёт GROUP BY, а нужно чтобы выдавалась последняя по дате. Как это реализовать?
 

Freakmeister

Новичок
В таком виде работает:
PHP:
$DB->query( "SELECT *, ($form_score) AS score FROM mkp_stats s1 WHERE NOT EXISTS
(SELECT * FROM mkp_stats s2 WHERE s1.ide = s2.ide AND s1.date < s2.date) ORDER BY $order");
Сейчас вы можете наблюдать это на странице.

Но у меня тут появилась более сумасшедшая идея. Пока не могу придумать как её реализовать, и вообще не уверен, что это можно сделать через SELECT одним запросом. Буду признателен за совет или идею.
Собственно, в таблице есть графа kills, я хочу чтобы в ней писалось не только кол-во убийств, а в скобках ещё сколько игрок наверстал с прошлого обновления статистики. Например, в таком виде: Убийства: 141234 (+117).
По идеи, тут надо вытаскивать последнюю запись, потом предпоследнюю запись и вычитать из последней предпоследнюю. Пока не могу даже себе представить как вытащить предпоследнюю запись... внутри цикла while( $row = $DB->fetch_row($query) ) { делать ещё одно обращение к бд нельзя?
 

Crys

Двинутый новичок
А если хранить предыдущую статистику в другой таблице и джоинить?
 

dr-sm

Новичок
[off]интересно когда-нибудь появятся в mysql window функции?
:)
[/off]
 

Freakmeister

Новичок
Автор оригинала: Crys
А если хранить предыдущую статистику в другой таблице и джоинить?
Можно создать и доп.столбец с прошлой статистикой, но это как-то на коленке. Мне интересно сначала узнать, мб есть способ сделать это красиво.
 

prolis

Новичок
Когда ты созреешь до понимания содержимого первой ссылки, тогда сможешь:
[sql]
select s1.ide,max(s1.name), max(s1.r) as r, max(s1.kills) as kills, max(s1.kills)-max(ifnull(s2.kills,0)) as kills_diff from mkp_stats s1
left join mkp_stats s2 on (s1.ide=s2.ide)
where s1.id>ifnull(s2.id,0)
group by s1.ide
[/sql]
 
Сверху