Сложный ORDER по дате

Статус
В этой теме нельзя размещать новые ответы.

Extalionez

Клоун
Заблокирован
Регистрация
21 Авг 2008
Сообщения
368
Реакции
191
  • Автор темы
  • Заблокирован
  • #1
Доброго всем времени суток!!! Задача следующая. Есть таблица, вывод которой нужно отсортировать по полю дата следующим образом:
Сначала даты, ближайшие к сегодняшней, по возрастанию. То есть:
18.02.1012
18.02.2012
среди этих одинаковых дат первой должны быть та, которая была создана позже.(в таблице ещё одно datetime-поле created_date)
19.02.2012
20.02.1012
и т.д., а потом уже
17.02.2012
16.02.2012
то есть то, что старше сегодняшней в самом конце должно быть. Есть идеи?:ah:
 
А какая хоть база, точнее какой движек. Если mysql или sqlite то советую забить на это дело. Долго трудно мучительно и скрости 0
тогда брать свой скрипт/программу и пробовать примеры найденные в гугле по запросу
bubble sorting (мой язык программирования)
 
Переводи дату в формат Unix time... И все проблемы будут решены автоматически.

Делается это 1 запросом, где стоит просто Order By date. Дальше уже PHP-скриптом ты заносишь все будущие записи в переменную, в формате $text = $date . $text. Дальше выводим сегодняшние, выводим $text, выводим прошлые...
 
  • Автор темы
  • Заблокирован
  • #4
А какая хоть база, точнее какой движек.
mysql innodb
Переводи дату в формат Unix time... И все проблемы будут решены автоматически.
Делается это 1 запросом, где стоит просто Order By date. Дальше уже PHP-скриптом ты заносишь все будущие записи в переменную, в формате $text = $date . $text. Дальше выводим сегодняшние, выводим $text, выводим прошлые...
Что-то полчаса думал о чём это, но так и не понял:D
 
Смотри, у тебя есть даты... Идут в хаотическом порядке...

1) Делаем выборку, упорядоченную по датам от большей к меньшей.

Получаем багу - сначала идут сообщения "из будущего", потом текущие, потом "из прошлого". Нам надо поменять будущие и настоящие местами...

2) Делаем условие: если дата больше текущей - сохранять эту статью в переменную, а не выводить на экран.

3) Если дата совпадает - выводим на экран

4) Если дата меньше текущей - выводим на экран переменную со статьями "из будущего", выводим "из прошлого", продолжая цикл.

Итог: Сегодня 18, у нас идёт в выборке статьи 24, 23, 22, 18, 17, 16. Скрипт преобразовал это в 18, 24, 23, 22, 17, 16... Нас это тоже не совсем устраивает... Делаем следующее:

PHP:
$post = 24;
$post .= 23 . $post;
Итог, мы получили переменную в которой даты идут 22, 23, 24...

Теперь всё это собираем и получаем что ты хотел:
18, 22, 23, 24, 17, 16

Могу на PHP набросать, если всё совсем плохо объяснил...
 
  • Автор темы
  • Заблокирован
  • #6
Могу на PHP набросать, если всё совсем плохо объяснил...
набросай плз:ah: Объяснил ты понятно, но я не настолько умный:oops:
Ты хочешь нарисовать 2 цикла и записывать в них по-порядку данные по условиям даты?
 
PHP:
//Как бы получили данные из мускула
$array = array (
    
    1 => array ('date' => 24, 'title' => 'Статья от 24 февраля<br />'),
    2 => array ('date' => 23, 'title' => 'Статья от 23 февраля<br />'),
    3 => array ('date' => 22, 'title' => 'Статья от 22 февраля<br />'),
    4 => array ('date' => 18, 'title' => 'Статья от 18 февраля<br />'),
    5 => array ('date' => 17, 'title' => 'Статья от 17 февраля<br />'),
    6 => array ('date' => 16, 'title' => 'Статья от 16 февраля<br />'),
    7 => array ('date' => 15, 'title' => 'Статья от 15 февраля<br />'),
    
    );

//Сегодня 18 февраля
$date = 18;
$i = 1; //Делается автоматом mysql_fetch_array
//Обрабатываем в цикле по строчно:
while ($i < 8) { //У тебя здесь будет mysql_fetch_array
    
    $day = $array[$i]; //Делается автоматом mysql_fetch_array
    
    if ($day[date] > $date) $post = $day['title'] . $post;
    if ($day[date] == $date) echo $day['title'];
    if ($day[date] < $date) {
        echo $post;
        echo $day['title'];
		$post = '';
    } 
    $i++;
    
}

Результат будет:

HTML:
Статья от 18 февраля
Статья от 22 февраля
Статья от 23 февраля
Статья от 24 февраля
Статья от 17 февраля
Статья от 16 февраля
Статья от 15 февраля
Написал топорно, но зато понятно =)
 
  • Автор темы
  • Заблокирован
  • #8
Код:
SELECT CASE WHEN  MyDate>=:Date THEN -1 ELSE 1 END AS pr1,
    ABS(DATEDIFF(MyDate,:Date)) AS pr2,
    MyDate,...
  FROM MyTable
  ORDER BY 1,2
:closed:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху