За последние 24 часа нас посетили 16429 программистов и 1678 роботов. Сейчас ищут 906 программистов ...

Запрос на выборку посл. записей

Тема в разделе "MySQL", создана пользователем Armitage89, 25 мар 2015.

  1. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Доброго времени суток.

    Подскажите, будьте добры, по формулировке такого запроса: имеем таблицу(журнал событий к примеру), хранящую в себе 3 поля: TYPE(CHAR), DATE, DETAILS. TYPE хранит в себе записи типа WARNING, ATTENTION и т.д. DATE - последняя дата возникновения события.

    Задача: нужно выбрать самые последние события на дату Н каждого типа.
    Первое, что пришло в голову, это: Select * from SomeTable where DATE<= somedate group by TYPE order by DATE DESC,
    но это лишь сгруппировало события с отображением последних(насколько я понимаю). Нужен же непосредственный отбор именно этих последних событий.

    Заранее благодарен.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Select * from SomeTable where NOW() < DATE order by DATE DESC,
     
  3. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Немного не то. Имеем 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
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а дата прям так и записана?
     
  5. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    тьху. По правилам типа DATE аля 2015-03-15.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Может DISTINCT
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Что в указанной таблице является первичным ключом? Есть уникальные значения?

    Вообще получить последнюю дату каждого события так:
    Код (Text):
    1. SELECT `type`, MAX(`date`)
    2. FROM `mytable`
    3. GROUP BY `type`
    Вот с `details` будет сложнее, его нельзя просто взять и подставить в этот запрос. Потому что нельзя и всё. )))
    Автор, расскажи про первичный ключ, может что-нибудь вымутим.
     
  8. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Да вот дали задали такую задачку. Первичного ключа нет. Таблица из себя представляет просто набор записей, где ориентиром выступает дата(тобиш не бывает несколько записей одного типа с одинаковой датой). Цель - выбрать непосредственно последние записи без группировок и т.д.(вывод получался одним куском)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Первичный ключи должен быть полюбому, а макс./мин. значения в группе значений получаются через группировку. Больше я тебе ничем не смогу помочь.
    Из кривых данных не получить ровный результат. Либо ты что-то не понял, либо задача неполная.
     
  10. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Да я то не спорю касательно специфики данных :) Сам предложил вариант с group by, но, судя по всему, нужно из этого запроса извлечь именно последние записи, дабы получать тем же count(*), одно значение а не набор значений, исходя из к-ва групп.
    А за помощь спасибо.
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    может set три переменные получать id каждого типа и потом сделать ещё запрос и выбрать по этим id
    http://stackoverflow.com/a/3156565
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    denis01, вот я и пытаю автора про первичный ключ. но он утверждает, что id нет.

    Есть по крайней мере два приема для получения первой/последней полной записи из каждой группы.
    http://dev.mysql.com/doc/refman/5.0/en/example-maximum-colu ... p-row.html
    Интересен второй вариант: нахождение минимума через открытое соединение с той же самой таблицей.
    В любом случае надо быть уверенным, что искомая запись уникальна по указанным условиям.
     
  13. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Допустим что вводится поле счетчика id.
    ------
    Да, а со счетчиком удалось связать повторяющиеся записи. Получил одним пакетом нужные записи. Вот думаю, можно ли обыграть это дело без использования счетчика.

    Пока что остановлюсь на этом варианте(разве что найдутся ещё варианты). Всем спасибо за помощь.
     
  14. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    А подзапрос не катит?
    Код (Text):
    1. select * from table
    2. where date in (Select max(date) from table where date < '2015-03-19'
    3. group by type)
     
  15. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Тоже катит, но при наличии id
     
  16. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    type date details
    warning 2015-03-15 второй
    notice 2015-03-18 четвертый
    attention 2015-03-18 пятый

    По Вашему примеру без id получился такой результат
     
  17. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Попробуйте с доп записью "warning 2015-03-18 adsasd" и с date < "2015-03-19". У меня хватает обе записи warning -> за 03-15 и за 03-18
     
  18. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    Запрос Выше.
    Результат:

    type date details
    notice 2015-03-18 четвертый
    attention 2015-03-18 пятый
    warning 2015-03-18 шестая

    Добавлено спустя 3 минуты 22 секунды:
    Как это две?
    Запрос покажите.
     
  19. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    Хм. Действительно. Интересный момент - в таблице, где я в конечном итоге вписал поле уникального счетчика, сей запрос показывает ранее упомянутые результаты, тобиш вытаскивает warning ещё и за 2015-03-15. Тот же запрос на идентичной таблице без ключа - всё отрабатывает как надо. Благодарю.

    ----
    Касательно принадлежности ключа - тоже нет. Создал из интереса новую таблицу - нареканий нет. Сижу и думаю теперь, в чем же "уникальность" первой тестовой таблицы :)

    ХЫ. Добавил в таблицу новую запись аля "notice 2015-03-17 dasda" и проблема "рассосалась" :) Перед этим специально прошелся по значениям, которые мне выдало в результате последнего запроса - вродь TYPE идентичный. Мистика.
     
  20. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    Возможно Вы в таблице пробел вбили перед warning)

    Добавлено спустя 1 минуту 8 секунд:
    Рад помочь)
     
  21. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    Вообщем этот запрос выбирает строки по значению даты возвращенной подзапросом (возвращает он значение, а не ссылку), что на мой взгляд не совсем верно, хотя работает как надо, точнее возвращает нужный результат.
    Помоему правильнее уточнить желаемый результат так:
    Код (Text):
    1. select * from table
    2. where (type, date) in (Select type, max(date) from table where date < '2015-03-19'
    3. group by type)
    то есть теперь подзапрос возвращает тип и дату
    Поправьте если заблуждаюсь...
     
  22. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    В силу того, что я более года не видел SQL, а тот что видел не имел подзапросов, затрудняюсь сказать что-то касательно достоверности добавочного условия.
     
  23. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    Сомнения вызывает первый вариант, а не второй )
     
  24. Armitage89

    Armitage89 Новичок

    С нами с:
    25 мар 2015
    Сообщения:
    11
    Симпатии:
    0
    По логике как-бы да - устанавливается больше связей и результат должен быть более точным, но не излишни ли эти связи в данном случае?
     
  25. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22
    Т.е уникальна комбинация (type,date)?
    Тогда первый вариант неверный (можно подобрать данные, когда это очевидно), второй правильный.
    Почему так, и как ещё можно решить задачу, см статью