Доброго времени суток. Подскажите, будьте добры, по формулировке такого запроса: имеем таблицу(журнал событий к примеру), хранящую в себе 3 поля: TYPE(CHAR), DATE, DETAILS. TYPE хранит в себе записи типа WARNING, ATTENTION и т.д. DATE - последняя дата возникновения события. Задача: нужно выбрать самые последние события на дату Н каждого типа. Первое, что пришло в голову, это: Select * from SomeTable where DATE<= somedate group by TYPE order by DATE DESC, но это лишь сгруппировало события с отображением последних(насколько я понимаю). Нужен же непосредственный отбор именно этих последних событий. Заранее благодарен.
Немного не то. Имеем 5 записей: type \\ date \\ details 1. warning \\ 20-03-2015 \\ ... 2. warning \\ 15-03-2015 \\ --- 3. attention \\ 17-03-2015 \\ ___ 4- notice \\ 18-03-2015 \\ 333 5. attention \\ 18-03-2015 \\ fds нужно получить записи, где date<19-03-2015, тобиш 2. warning \\ 15-03-2015 \\ --- 4- notice \\ 18-03-2015 \\ 333 5. attention \\ 18-03-2015 \\ fds
Что в указанной таблице является первичным ключом? Есть уникальные значения? Вообще получить последнюю дату каждого события так: Код (Text): SELECT `type`, MAX(`date`) FROM `mytable` GROUP BY `type` Вот с `details` будет сложнее, его нельзя просто взять и подставить в этот запрос. Потому что нельзя и всё. ))) Автор, расскажи про первичный ключ, может что-нибудь вымутим.
Да вот дали задали такую задачку. Первичного ключа нет. Таблица из себя представляет просто набор записей, где ориентиром выступает дата(тобиш не бывает несколько записей одного типа с одинаковой датой). Цель - выбрать непосредственно последние записи без группировок и т.д.(вывод получался одним куском)
Первичный ключи должен быть полюбому, а макс./мин. значения в группе значений получаются через группировку. Больше я тебе ничем не смогу помочь. Из кривых данных не получить ровный результат. Либо ты что-то не понял, либо задача неполная.
Да я то не спорю касательно специфики данных Сам предложил вариант с group by, но, судя по всему, нужно из этого запроса извлечь именно последние записи, дабы получать тем же count(*), одно значение а не набор значений, исходя из к-ва групп. А за помощь спасибо.
может set три переменные получать id каждого типа и потом сделать ещё запрос и выбрать по этим id http://stackoverflow.com/a/3156565
denis01, вот я и пытаю автора про первичный ключ. но он утверждает, что id нет. Есть по крайней мере два приема для получения первой/последней полной записи из каждой группы. http://dev.mysql.com/doc/refman/5.0/en/example-maximum-colu ... p-row.html Интересен второй вариант: нахождение минимума через открытое соединение с той же самой таблицей. В любом случае надо быть уверенным, что искомая запись уникальна по указанным условиям.
Допустим что вводится поле счетчика id. ------ Да, а со счетчиком удалось связать повторяющиеся записи. Получил одним пакетом нужные записи. Вот думаю, можно ли обыграть это дело без использования счетчика. Пока что остановлюсь на этом варианте(разве что найдутся ещё варианты). Всем спасибо за помощь.
А подзапрос не катит? Код (Text): select * from table where date in (Select max(date) from table where date < '2015-03-19' group by type)
type date details warning 2015-03-15 второй notice 2015-03-18 четвертый attention 2015-03-18 пятый По Вашему примеру без id получился такой результат
Попробуйте с доп записью "warning 2015-03-18 adsasd" и с date < "2015-03-19". У меня хватает обе записи warning -> за 03-15 и за 03-18
Запрос Выше. Результат: type date details notice 2015-03-18 четвертый attention 2015-03-18 пятый warning 2015-03-18 шестая Добавлено спустя 3 минуты 22 секунды: Как это две? Запрос покажите.
Хм. Действительно. Интересный момент - в таблице, где я в конечном итоге вписал поле уникального счетчика, сей запрос показывает ранее упомянутые результаты, тобиш вытаскивает warning ещё и за 2015-03-15. Тот же запрос на идентичной таблице без ключа - всё отрабатывает как надо. Благодарю. ---- Касательно принадлежности ключа - тоже нет. Создал из интереса новую таблицу - нареканий нет. Сижу и думаю теперь, в чем же "уникальность" первой тестовой таблицы ХЫ. Добавил в таблицу новую запись аля "notice 2015-03-17 dasda" и проблема "рассосалась" Перед этим специально прошелся по значениям, которые мне выдало в результате последнего запроса - вродь TYPE идентичный. Мистика.
Вообщем этот запрос выбирает строки по значению даты возвращенной подзапросом (возвращает он значение, а не ссылку), что на мой взгляд не совсем верно, хотя работает как надо, точнее возвращает нужный результат. Помоему правильнее уточнить желаемый результат так: Код (Text): select * from table where (type, date) in (Select type, max(date) from table where date < '2015-03-19' group by type) то есть теперь подзапрос возвращает тип и дату Поправьте если заблуждаюсь...
В силу того, что я более года не видел SQL, а тот что видел не имел подзапросов, затрудняюсь сказать что-то касательно достоверности добавочного условия.
По логике как-бы да - устанавливается больше связей и результат должен быть более точным, но не излишни ли эти связи в данном случае?
Т.е уникальна комбинация (type,date)? Тогда первый вариант неверный (можно подобрать данные, когда это очевидно), второй правильный. Почему так, и как ещё можно решить задачу, см статью