Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 24 Май, 2012, 10:17:41

Страниц: [1] 2
Печать
Автор Тема: GROUP BY с последней датой  (Прочитано 666 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Freakmeister    ↓ 
25 Июль, 2010, 05:02:21
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

Есть табличка: 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, а нужно чтобы выдавалась последняя по дате. Как это реализовать?
Записан
Stasovsky    ↓ 
25 Июль, 2010, 05:27:26 , спустя 25 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3653
Сила слова: 1.48

ORDER BY date DESC
вроде так...
Записан
Freakmeister    ↓ 
25 Июль, 2010, 06:35:24 , спустя 1 час 7 минут 58 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

DESC отвечает за конечный вывод, к ORDER BY оно не аттачится. Тоесть, если без DESC у меня выдаёт: "Dr. Manhattan, Batman, FLASH", то с DESC выдаст просто обратный порядок: FLASH, Batman, Dr. Manhattan.
Записан
Stasovsky    ↓ 
25 Июль, 2010, 07:33:16 , спустя 57 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3653
Сила слова: 1.48

ну хз, у меня почему-то все нормально...
 
SQL
SELECT * FROM posts GROUP BY title ORDER BY created DESC"
сортирует по дате и последние вверху, не смотря на "GROUP BY title"
Спустя 1 минуту 6 секунд добавил
эт я на примере своей таблицы... мб у тебя какая-то волшебная_))_
Записан
Givi    ↓ 
25 Июль, 2010, 07:54:08 , спустя 20 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

Freakmeister, ты просто не совсем корректно понял к чему применяется DESC и ASC. На самом деле это не сама сортировка,  её тип. А следовательно, нужно указать к чему именно этот тип привязать. В твоем случае это дата.
Ну и за вывод никакая часть запроса не отвечает. Она отвечает лишь только за получение нужных данных в нужной форме/порядке из базы, остальное уже не её дело.
Записан

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
Freakmeister    ↓ 
25 Июль, 2010, 08:18:47 , спустя 24 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

Ок, а конкретика есть какая-то?)
$DB->query( "SELECT * FROM mkp_stats GROUP BY name ORDER BY date DESC"); - меняет порядок ORDER BY, а не GROUP BY.
$DB->query( "SELECT * FROM mkp_stats GROUP BY name DESC ORDER BY date"); - не работает.
Записан
Stasovsky    ↓ 
25 Июль, 2010, 08:28:55 , спустя 10 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

Сенсей XD
Группа: Джедаи

Карма: 54
Сообщений: 3653
Сила слова: 1.48

я вааще mysql позвала по пхпмайадмину)) там вроде DESC и ASC на ORDER BY вешаются))
или я совсем дурак и нифига не шарю))
Спустя 2 минуты 46 секунд добавил
хотя GROUP BY bla DESC пашет))
Спустя 1 минуту 25 секунд добавил
и даже такое пашет))
 
SQL
SELECT *
FROM `posts`
GROUP BY `bodytext` DESC
ORDER BY `created` DESC

но приоритет на последнее))
Спустя 1 минуту 36 секунд добавил
меняет порядок ORDER BY, а не GROUP BY.
на[рена тебе менять порядок GROUP если ты хочешь по дате?! оО
Записан
Freakmeister    ↓ 
25 Июль, 2010, 08:43:23 , спустя 14 минут 28 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

Ну не работает оно в моём коде, что ж мне, застрелиться теперь?) Подкинули вот мануал, сейчас буду курить: http://jan.kneschke.de/projects/mysql/groupwise-max/
Записан
adw0rd    ↓ 
25 Июль, 2010, 08:58:45 , спустя 15 минут 22 секунды
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

заюзай MAX() для нужного поля даты
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Givi    ↓ 
25 Июль, 2010, 09:05:20 , спустя 6 минут 35 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

Freakmeister, сделай двойную сортировку - сначала по дате, потом по имени. Получится так: ...ORDER BY date DESC, name;
Записан

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
Freakmeister    ↓ 
25 Июль, 2010, 11:18:52 , спустя 2 часа 13 минут 32 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

Один добрый дядя подсказал синтаксис:
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) ) { делать ещё одно обращение к бд нельзя?
Записан
adw0rd    ↓ 
25 Июль, 2010, 11:31:17 , спустя 12 минут 25 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

Вытащить 2 крайние записи и вычесть одну из другой никак?
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Freakmeister    ↓ 
26 Июль, 2010, 12:10:32 , спустя 39 минут 15 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

Наверно можно как-то. Меня интересует как.)
Записан
adw0rd    ↓ 
26 Июль, 2010, 12:15:08 , спустя 4 минуты 36 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

select field from table order by field2 desc limit 2
а в php $row[0]['field'] - $row[1]['field'], вот о чем я
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Freakmeister    ↓ 
26 Июль, 2010, 11:33:06 , спустя 11 часов 17 минут 58 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 10
Сила слова: 0

К запросу выше desc limit 2 прицепить не получится, потому что он просто выдаст 2 записи по разным никам и остановится на этом. Тут похоже надо делать второй запрос и очень не хотелось бы запихивать его в массив на 150 записей. Если сделать второе обращение к бд прямо внутри цикла первого обращения, то такая структура будет работать?
Записан
Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: Sinkler