За последние 24 часа нас посетили 34416 программистов и 1743 робота. Сейчас ищут 974 программиста ...

Вывод и сортировака ! Подскажите как это можно решить

Тема в разделе "PHP и базы данных", создана пользователем lemonl, 1 июл 2012.

  1. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Здравствуйте,

    Подскажите как это можно решить

    Есть таблица name_table

    Код (Text):
    1.  
    2. +----------+----------------+-------------+---------------------+
    3.     ID     |   valroot      | text        | date                |
    4. +----------+----------------+-------------+---------------------+
    5.      1     |  5825          | Claws       | 1994-03-17 15:15:19 |
    6.      2     |  5825          | Slims       | 1996-04-29 15:15:19 |
    7.      3     |  1912          | Whistler    | 1997-12-09 15:15:19 |
    8.      4     |  1912          | Wtlerrew    | 1997-11-09 15:15:19 |
    9.      5     |  5825          | Cloms       | 1998-09-11 15:15:19 |
    10.      6     |  9511          | Puffball    | 1999-03-30 15:15:19 |
    11. +----------+----------------+-------------+---------------------+
    Как вывести значение text в ветке valroot самое последние по дате после чего саму ветку отсортировать по ASC


    вывод должен работать следующим образом ...
    Код (Text):
    1.  
    2. +----------+----------------+-------------+---------------------+
    3.     ID     |   valroot      | text        | date                |
    4. +----------+----------------+-------------+---------------------+
    5.      6     |  9511          | Puffball    | 1999-03-30 15:15:19 |
    6.      3     |  1912          | Whistler    | 1997-12-09 15:15:19 |
    7.      5     |  5825          | Cloms       | 1998-09-11 15:15:19 |
    8. +----------+----------------+-------------+---------------------+
     
  2. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    для начала надо хранить время в timestamp (метка UNIX). А не в том формате, котором Вы храните.

    Добавлено спустя 1 минуту 16 секунд:
    метка UNIX - время в секундах или микросекундах от 1 января 1997 г. до сегодняшнего момента. Тобишь чем больше метка, тем позднее дата.
     
  3. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Да, все верно дата имеет формат YYYY-mm-dd HH:ii:ss ... забыл здесь упомянуть.

    Отсортировать всю таблицу проблем не составляет
    Код (Text):
    1. SELECT * FROM  name_table ORDER BY date  DESC
    Пока не знаю, как реализовать вывод который я упоминал выше...
     
  4. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    да ни как. Вот как я сказал так и делаете. Метка должна в базе храниться. Какая разница, так и так вы при выводе можете ее преобразовать. В чем проблема?
     
  5. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Вы меня извините но, как понимать "Метка должна в базе храниться"? Это дополнительная колонка в таблице?

    Есть ли хоть какие-то примеры? Везде искал ничего не нашел ...
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а по какому принципу сортировать-то надо?
     
  7. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    вот так и прямо понимать. Вы преобразуете свое время записывая его БД date("формат", time()). А это делать не надо. Оставляем только красное и будет Вам метка. А когда будите выводить ее из базы, то делаете так:

    date("формат", $sql['date'])

    Где переменная $sql['date'] - это результат.
    Сортируете так же по метке в обратном порядке (ORDER BY date DESC)
    Добавлено спустя 52 секунды:
    Включаем логику.
     
  8. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    По дате


    вывод должен работать следующим образом ...
    Код (Text):
    1.  
    2. +----------+----------------+-------------+---------------------+
    3.     ID     |   valroot      | text        | date                |
    4. +----------+----------------+-------------+---------------------+
    5.      6     |  9511          | Puffball    | 1999-03-30 15:15:19 |
    6.      3     |  1912          | Whistler    | 1997-12-09 15:15:19 |
    7.      5     |  5825          | Cloms       | 1998-09-11 15:15:19 |
    8. +----------+----------------+-------------+---------------------+
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    SELECT * FROM `name_table` ORDER BY `date` DESC GROUP BY `valroot`
    типа того
     
  10. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Да, то что нужно.

    Только еще нужно как-то отсортировать по дате после GROUP BY `valroot` и выводить последние значение text. То-есть после GROUP BY `valroot`в середине групы отсортировать по дате и выводить значение text.

    Сейчас выводится
    Код (Text):
    1.  
    2. +----------+----------------+-------------+---------------------+
    3.     ID     |   valroot      | text        | date                |
    4. +----------+----------------+-------------+---------------------+
    5.      1     |  5825          | Claws       | 1994-03-17 15:15:19 |
    6. +----------+----------------+-------------+---------------------+
    а нужно
    Код (Text):
    1.  
    2. +----------+----------------+-------------+---------------------+
    3.     ID     |   valroot      | text        | date                |
    4. +----------+----------------+-------------+---------------------+
    5.      5     |  5825          | Cloms       | 1998-09-11 15:15:19 |
    6. +----------+----------------+-------------+---------------------+
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    попробуй
    SELECT * FROM `name_table` ORDER BY `date` DESC, `id` DESC GROUP BY `valroot`

    только хз насколько это хорошо так делать =)
     
  12. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    )) так не работает.
     
  13. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    зачем в текстовом выводить епта? Сортируете по дате (в метке дата). А когда выводите, выводите date, но преобразуете его в читаемый (текстовый) вид.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да не о том речь. оно хранится в правильном виде, выводится в текстовом, это сам мускул так делает.

    просто местами перепутал. попробуй так

    SELECT * FROM `table_name` GROUP BY `valroot` ORDER BY `date` DESC , `id` DESC
     
  15. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Спасибо! Сделал по другому через JOIN max(date) ...
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  17. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    100% бред о котором он даже не знает)) Как увидит несостыковыку, поймет)
     
  18. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    С чего ты взяли что это бред, и какая еще может быть несостыковыка? ;) Напиши запрос который будет нормально работать как ты думаешь...


    Код (Text):
    1.  
    2. SELECT *
    3. FROM name_table t JOIN (
    4.     SELECT valroot, MAX(date) Maxdatetime
    5.     FROM name_table
    6.     GROUP BY valroot
    7. ) r ON t.valroot = r.valroot AND t.date = r.Maxdatetime
    8. ORDER BY t.date desc
     
  19. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    Что мы имеем:

    +----------+----------------+-------------+---------------------+
    ID | valroot | text | date |
    +----------+----------------+-------------+---------------------+
    5 | 5825 | Cloms | 98546587895 |
    +----------+----------------+-------------+---------------------+

    Время сохраняем в метке

    Делаем следующий запрос
    Код (Text):
    1. SELECT * FROM name_table ORDER BY date DESC
    Объясняю: UNIX_TIMESTAMP (метка времени) - Это кол-во секунд от 1 января 1970 года. Получается чем позднее дата, тем больше секунд. Улавливаешь? Поэтому я в своем запросе сортирую по дате (метке - число) в обратном поряке. Просто когда ты заносишь в базу данные, заноси не уже готовую дату как ты делаешь (date("формат", time())), а просто time(). А вот когда ты уже выводишь свои полученные данные, то делай уже так: date("формат", $row['date'])

    Розовым - это полученный результат. В нашем случае это 98546587895 - мы ее преобразуем в читаемую дату
     
  20. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Как я уже ранее писал мне удалось сделать
    Код (Text):
    1.  
    2. SELECT *
    3. FROM name_table t JOIN (
    4.     SELECT valroot, MAX(date) Maxdatetime
    5.     FROM name_table
    6.     GROUP BY valroot
    7. ) r ON t.valroot = r.valroot AND t.date = r.Maxdatetime
    8. ORDER BY t.date desc
    Но нужно добавить в строку запроса еще одну таблицу с выражением, делаю следующее
    Код (Text):
    1.  
    2. SELECT *
    3. FROM name_table t, else_name_table g JOIN (
    4.     SELECT valroot, MAX(date) Maxdatetime
    5.     FROM name_table
    6.     GROUP BY valroot
    7. ) r ON t.valroot = r.valroot AND t.date = r.Maxdatetime
    8. ORDER BY t.date desc
    Не работает ! Помогите !