Выборка максимального и минимального значения.

  • Автор темы Admiral
  • Дата начала

Admiral

Guest
Выборка максимального и минимального значения.

Здрасте. Есть таблица:
Код:
+-------+---------------+
| name  | varchar(10)   |
| res   | varchar(10)   |
| dt    | timestamp(14) |
+-------+---------------+
В ней для каждого name существуют несколько записей, отличающиеся двумя другими полями. Например:
Код:
+-----------+-------+----------------+
| name      | res   | dt             |
+-----------+-------+----------------+
| Vasya     | aaa   | 20041206195655 |
| Vasya     | bbb   | 20041206195708 |
| Vasya     | ccc   | 20041206195714 |
| Vasya     | ddd   | 20041206195717 |
+-----------+-------+----------------+
Вопрос: Как выбрать по одной записи для каждого name сначала с минимальной датой (dt), а потом с максимальной? (необязательно в одном запросе) В данном примере это "Vasya aaa" и "Vasya ddd". Спасибо заранее.
 

Demiurg

Guest
а если там еще будет запись
| Vasya | eee | 20041206195717 |
?
 

Admiral

Guest
Нет, по условию не может быть двух записей с одинаковым именем и временем.
 

chira

Новичок
два SQL
[SQL]
CREATE TEMPORARY TABLE tt AS
SELECT name,min(dt) min_dt, max(dt) max_dt
FROM my_table
GROUP BY 1;
SELECT a.*
FROM my_table a, tt
WHERE a.name = tt.name AND a.dt IN (tt.min_dt,tt.max_dt);
[/SQL]
 

Admiral

Guest
chira, нужно отдельно выбрать сначала все имена с макс. датой, а потом с минимальной. чтобы потом можно было разницу между результатами считать. но спасибо :)
 

chira

Новичок
какую ещё разницу? ты говорил о разнице результатов?
 

Admiral

Guest
я в первом посте написал, что мне надо выбрать сначала одни записи, потом ОТДЕЛЬНО выбрать другие записи, а потом уже что-либо с ними делать в пхп. Т.е. не в одном запросе все вместе, а сначала все имена с минимальными датами, потом все имена с максимальными датами.
 

tana

Guest
Автор оригинала: Admiral
я в первом посте написал, что мне надо выбрать сначала одни записи, потом ОТДЕЛЬНО выбрать другие записи, а потом уже что-либо с ними делать в пхп. Т.е. не в одном запросе все вместе, а сначала все имена с минимальными датами, потом все имена с максимальными датами.
А зачем тебе делать два запроса? Если тебе нужны только цифровые данные - минимум и максимум, можно обойтись одним:
SELECT name, min(dt) as mindt, max(dt) as maxdt FROM `ttt` group by name

если что-то простое нужно сделать с датами, то можно прямо в mysql (у него куча функций для работы с датами - см. документацию к mysql):
SELECT name, min(dt) as mindt, max(dt) as maxdt, min(dt)-max(dt) as ress FROM `ttt` group by name

Если все же очень нужно сделать два запроса, то:
1) SELECT name, min(dt) as mindt FROM `ttt` group by name
2) SELECT name, max(dt) as maxdt FROM `ttt` group by name

устроит?
 

Admiral

Guest
Нет не устроит. Это вернёт список имен и минимальных/максимальных дат к ним. Но спасибо, я подумаю в этом направлении.
 
Сверху