Вопрос № 44001: Здравствуйте, уважаемые эксперты!
Предположим, что есть такая таблица:
mysql> select * from test;
+---------------------+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 | field5 |
+---------------------+--...
Вопрос № 44.001
Здравствуйте, уважаемые эксперты!
Предположим, что есть такая таблица:
mysql> select * from test;
+---------------------+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 | field5 |
+---------------------+--------+--------+--------+--------+
| 2006-04-07 00:00:48 | 2 | 1 | 2 | 1 |
| 2006-04-07 00:00:49 | 4 | 1 | 2 | 3 |
| 2006-04-07 00:01:49 | 5 | 1 | 2 | 2 |
| 2006-04-07 00:03:49 | 2 | 3 | 4 | 1 |
| 2006-04-07 00:03:29 | 5 | 3 | 4 | 3 |
| 2006-04-07 00:03:20 | 2 | 3 | 2 | 1 |
| 2006-04-07 00:03:20 | 3 | 3 | 2 | 3 |
| 2006-04-07 00:01:20 | 3 | 2 | 2 | 3 |
+---------------------+--------+--------+--------+--------+
Все эти строчки разбиваются логически на группы, у которых одинаковые поля field3 и field4. Но нужно вытащить только те группы, для которых строчка с некоторым значением field2 (например, field2=2 или field2>3 и т.п.). То есть для этой таблицы и field2=2, например, нужно вытащить все строчки, кроме последней. Как это сделать?
Еще можно использовать дополнительную таблицу, и тогда было бы желательно вытащить следующее:
для каждой выделенной группы (по значению field3 и field4 и по условию на field2), вытащить min(field1), field2=2, field3, field4 и sum(field5), причем суммировать и искать минимум только для строчек из этой группы. То есть для каждой существующей группы в первой таблице создать одну строчку во второй таблице.
И еще такой вопрос - первое поле в формате datetime. А есть ли какие-то встроенные функции для вытаскивания отдельно даты, отдельно времени?
Спасибо большое!
Отвечает: Samum
Здравствуйте, lupus campestris!
По первому запросу для MySQL (версии где-то выше 4) все достаточно просто:
SELECT *
FROM `lupus`
WHERE (field3, field4) IN
(
SELECT DISTINCT field3, field4
FROM `lupus`
WHERE field2 =2
);
С MsSQL все обстоит сложнее, т.к. она подобные запросы не поддерживает. Самый простой вариант - добавить к таблице еще один столбец - уникальный индекс. Тогда подобный запрос будет работать практически на любой СУБД:
SELECT *
FROM lupus
WHERE unique_field IN
(
SELECT DISTINCT unique_field
FROM lupus
WHERE field2 = 2
);
Вопрос номер два - по аналогии для MySQL (у меня просто с ней опыта побольше):
SELECT min( field1 ) min_field1, sum( field5 ) , field3, field4
FROM `lupus`
WHERE (field3, field4)
IN (
SELECT DISTINCT field3, field4
FROM `lupus`
WHERE field2 =2
)
GROUP BY field3, field4;
А на счет выбора отдельно даты, отдельно - времени, использовать можно конструкцию
CAST(datetime_field AS DATE) - дата
CAST(datetime_field AS TIME) - время. Работает и в MySQL, и в MsSQL.
--------- Если бы программистам за их ошибки отрывали части тела, то в конце концов им пришлось бы использовать голову!
Ответ отправил: Samum (статус: Специалист)
Ответ отправлен: 23.05.2006, 21:41 Оценка за ответ: 5