За последние 24 часа нас посетили 7863 программиста и 434 робота. Сейчас ищут 263 программиста ...

Затык с диалогами. Нид хелп!

Тема в разделе "PHP для новичков", создана пользователем AlexProg, 13 фев 2020.

  1. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    281
    Симпатии:
    6
    Всем добра!

    Парни, туплю с диалогами что-то...

    Обычный чат, сообщение, дата. НО! Хотелось бы дату выводить 1 раз. (как во Вконтакте)
    Т.е. написал вчера будет 12 февраля и 100500 сообщений без даты. Написал сегодня, будет 13 февраля и ниже сообщения.
    В бд лежит каждое сообщение с датой. Вывожу в цикле, аякс.
    Сам запрос:
    PHP:
    1. SELECT *,db_mail_full.date as mess_data
    2.                 FROM db_mail_full, db_mail_id
    3.                 WHERE db_mail_id.id = db_mail_full.id_ticket
    4.                 AND db_mail_full.id_ticket = ? ORDER BY db_mail_full.id DESC LIMIT 20
    Пробовал с GROUP BY FROM_UNIXTIME(db_mail_full.date, '%Y-%m-%d') , но это видимо не выход.

    Спасибо всем кто подскажет куда копать!
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.332
    Симпатии:
    462
    Адрес:
    Татарстан
    В запросе этого не добьешься, потому как там нет понятия текущий, предыдущий, последующий...
    Проще всего при выводе это делать,
    1) если переменная пуста - то вывел сообщение с датой - запомнил дату в переменную,
    2) следующее сообщение перед тем как вывести - сверяешь с этой переменной, если дата та-же, её не выводишь, если изменилась - то в п 1 идем, и так в цикле все выводишь
     
    AlexProg нравится это.
  3. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    281
    Симпатии:
    6
    @ADSoft, в БД дата в UNIX, поэтому всегда будет разной.
    Число сверять!? Тогда 12 января и 15 февраля будет хрень.
    В общем решение НЕ найдено.
     
  4. виталий032

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

    С нами с:
    31 янв 2014
    Сообщения:
    226
    Симпатии:
    30
    Адрес:
    Владивосток
    Код (Text):
    1. SELECT *, db_mail_full.date as mess_data, FROM_UNIX_TIME(db_mail_full.date, '%Y-%m-%d') as chat_date
    2. FROM db_mail_full, db_mail_id
    3. WHERE db_mail_id.id = db_mail_full.id_ticket
    4. AND db_mail_full.id_ticket = ?
    5. ORDER BY db_main_full.date DESC LIMIT 20
    Результатирующая выборка из базы будет с сообщениями от самого последнего до самого раннего (сортировка по unix дате, надеюсь оно так работает).
    В каждой строчке будет дополнительное поле chat_date (см.запрос). Для сообщений, написанных в один и тот же день значение этого поля будет одинаковым, так как время не учитывается ('%Y-%m-%d').

    Дальше уже то, что советовал @ADSoft.