Forum Webscript.Ru
Общие => Базы данных => Тема начата: DIvZ от 27 Апреля 2004, 17:32:26
-
Есть таблица sorev
n data s
1 2004-01-01 12
2 2004-01-01 14
3 2004-01-01 11
4 2004-01-01 0
3 2004-01-02 6
2 2004-01-02 9
4 2004-01-02 3
3 2004-01-03 14
4 2004-01-03 6
То есть номер участника, дата участия и дальше какие-то данные.
Как мне выбрать одним запросом данные для каждого участника на последнюю дату их участия т.е
1 2004-01-01 12
2 2004-01-02 9
3 2004-01-03 14
4 2004-01-03 6
select n,max(data),s from sorev group by n;
не подходит так как все поля после второго случайные.
select n,data,s from sorev order by data group by n;
не работает по синтаксису.
Помогите. База mysql.
-
Может конечно не лучший вариант, но первый который пришел в голову...
create table sorev
(
id int not null primary key auto_increment,
n int,
date date,
s int
);
делать двумя запросами:
select n, MAX(date) AS date from sorev group by n
select s FROM sorev WHERE n=\'$n\' AND date=\'$date\'
-
Трюк "MAX-CONCAT" может помочь:
SELECT n,
substring( max( concat(data,lpad(s,6,\'0\')) ), 11)/1 as s,
substring( max( concat(data,lpad(s,6,\'0\')) ), 1, 10) as date,
count(*) AS times
FROM sorev
GROUP by n
+ получаете количество участий (times) для каждого участника (n).
lpad(s,6,\'0\') преобразует "12" в "000012".
concat(data,lpad(s,6,\'0\')) создает строку "2004-01-01 000012".
"Разумеется, пример можно сделать чуть эффективнее, если разбиение катенизированной строки делать на стороне клиента."