Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 97
от 28.05.2006, 17:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 302, Экспертов: 37
В номере:Вопросов: 1, Ответов: 1


Вопрос № 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. А есть ли какие-то встроенные функции для вытаскивания отдельно даты, отдельно времени?
Спасибо большое!
Отправлен: 23.05.2006, 17:24
Вопрос задала: lupus campestris (статус: Профессионал)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.33 от 25.05.2006
Яндекс Rambler's Top100

В избранное