Непростая сортировка и вывод по дате записи

Тема в разделе "Как сделать...", создана пользователем PhantomUA, 17 ноя 2012.

  1. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Что-то после тяпницы голова не варит... :D
    Помогите реализовать... или хотя бы направьте в нужное русло :ah:
    Есть таблица с сообщениями и датами их размещения..
    Код:
      `id` int(11) NOT NULL auto_increment,
      `to_id` int(11) NOT NULL,
      `from_id` int(11) NOT NULL,
      `senddate` datetime NOT NULL default '0000-00-00 00:00:00',
      `is_new` int(11) NOT NULL default '1',
      `message` text NOT NULL,
    
    Нужно реализовать вывод в виде:
    [​IMG]
    Ищется путь реализации вывода записей с разделением надписями: сегодня, вчера, неделю/две недели назад.. месяц назад и т.п.
     
  2. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Спешу тебя огорчить - данная задача ложится не на базу данных, а на php. От базы данных требуется лишь сортировать вывод по дате. А уже в цикле вывода php с помощью http://www.php.net/manual/ru/datetime.diff.php (PHP 5 >= 5.3.0) вставлять в цикл вывода разделители
     
  3. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    Не понимаю сложность задачи, на выходе по идеи массив данных и каждое сообщение имеет дату, так на выходеи смотреть какая у него давность, или есть принципиальность использовать ресурсы DB, если да, то только if помогут, указанием в качестве поля, и проверка по дате.

    Если нужно выбрать сообщения разной давности, такая же история, простой where и диапазон дат
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    Мой косяк - изначально тема была в php создана...
    Спешу тебя огорчить в ответ - зависит от количества записей, которые вернёт запрос к бд.
    Я сразу прикинул, что в ответ мы можем получить миллион строк и для вывода 10 записей с шагом по времени сортировку делать на php будет расточительством, потому тему и перенёс в раздел БД.

    2 TC делал бы с помощью strtotime ("-1 day"), strtotime ("-1 week"), strtotime ("-1 month"), ....
    как понимаешь этот ряд вернёт метки времени для вчера, неделю назад, месяц назад...
     
  5. begemot3

    begemot3 Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    52
    Симпатии:
    13
  6. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Ну миллиона не будет.. так как выборка идет по определенному id пользователя а не все сразу ))
    Поэтому хотелось бы через PHP реализовать а не делать отдельные выборки с интвервалом дат...
    Соотвественно как написал немного выше получится что надо делать отдельные запросы с интвервалами дат... А хотелось бы с помощью PHP разбить на блоки/масивы после 1 запроса к базе :)

    Я в курсе таких запросов )) Практики хватает.. А чего хотелось бы - написал выше ))
    Чтобы самому пока придумать - нужно чтобы голова немного просветлела... наверно это уже будет завтра.. если до того времени никто не подскажет ))
     
  7. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    да ктож будет миллион строк выводить на одной странице:eek:
    там уже любой браузер с ума сойдёт от такого объёма.
    Да и кто говорит про сортировку? нужно лишь вставить в цикл вывода разделитель и всё!
    ТС, как конкретно надо разделять? по дням, неделям и т.д.
     
  8. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Можно поидее в PHP сравнить разницу даты размещения и текущей даты и если она больше какого-то значения пихать в разные масивы... А в запросе к бд сделать сортировку от старых записей к новым... А на выводе просто сделать проверку если есть в масиве данные и если есть то выводить в нужный блок... Как один с вариантов реализации наверно пойдет... буду дальше думать...


    Плодить запросы к БД не хочется.. так как и других хватает :)

    Да, что-то подобное... например: сегодня, вчера, неделю назад, месяц назад и год назад...
    Вот о разделителе и идет речь.. как его правильно и оптимально реализовать :) и чтобы записи выводило отдельными блоками.. так как их придется наверно через jquery свернуть/развернуть :)
     
  9. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Ну тогда просто впихнуть разделитель тут не в помощь.
    Придётся сдаётся мне делать несколько циклов для каждого интервала. Правда это уже попахивает быдлокодом.
     
  10. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Не обязательно... есть результат с БД.... делаем перебор элементов (foreach например) и сравниваем дату с текущей... дальше через if или switch раскидываем по массивам в зависимости от разницы дат... Массивы передаем в шаблонизатор... в нем проверка на наличие в массиве данных... есть - вывод в блоке.. Нет - проверка следующего массива... пока оптимальнее ничего не придумал... если до утра ничего лучшего не посоветуют - со свежей головой постараюсь еще подумать :)