[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка по 2 полям
alex12060
Здравствуйте форумчане. Уже 2 день воюю с запросом, который неверно сортирует данные.

Вот запрос, сейчас распишу, что делает и что должен делать.


SELECT br. * , bc.blog_id AS `bid` , bc.date AS `create_date` , bc.id AS `bcit` , t.familia_t, t.name_t, bb.caption AS `bbc` , bb.redactor_id, bb.status
FROM blogs_records AS `br`
LEFT JOIN `blogs_citations` AS `bc` ON ( bc.record_id = br.id )
LEFT JOIN `blogs_blogs` AS `bb` ON ( bb.id = br.blog_id )
LEFT JOIN `turist` AS `t` ON ( br.author_id = t.ID_t )
WHERE `draft` != 1
HAVING (
(

br.blog_id =12257
AND ISNULL( bid )
)

OR (
br.blog_id !=12257
AND bid =12257
)
)

ORDER BY br.create_date, bc.date DESC
LIMIT
0 , 20
/* OO Query */


В общем, этот запрос выводит записи из определенного блога, вытаскивает еще из 3 таблиц информацию, оторая нужна.

Все работает, но не сортирует так, как надо.

Заказчик поставил условие - что когда добавляешь запись к себе в блог с чужого (таки сказать "цитируешь запись"), то она добавляется в самое начало блога, но если вдруг, ты добавил запись новую (сам создал), то она (цитированная запись) должна уйти вниз на 1, и так далее.

Собственно, сделать не сложно - сортировать данные по 2-м полям, но, сортирует очень неверно.

Ребята, кто что подскажет?

У меня есть 2 идеи:
  • Использовать как-то условия в запросе, т.е. если это цитата, то добавлять дату "цитирования" в дату создания записи, и тогда просто можно сортировать по столбцу create_date
  • Создать костыль, и отсортировать записи при помощи PHP, но думаю, это жестоко...

Если нужны будут доп. данные, по мере возможности предоставлю. Заранее спасибо.



Спустя 33 минуты, 21 секунда (4.03.2012 - 14:09) Placido написал(а):
А зачем в этом запросе HAVING? Ведь здесь нет ни агрегатных функций, ни группировки...

Спустя 48 минут, 30 секунд (4.03.2012 - 14:58) alex12060 написал(а):
Placido

Я могу обсудить этот вопрос с тобой после того, как будет решена моя проблема smile.gif

Спустя 23 минуты, 7 секунд (4.03.2012 - 15:21) Visman написал(а):
alex12060, что за прикол?

Цитата (alex12060 @ 4.03.2012 - 18:36)
br.create_date

Цитата (alex12060 @ 4.03.2012 - 18:36)
bc.date AS `create_date`


Спустя 2 минуты, 10 секунд (4.03.2012 - 15:23) alex12060 написал(а):
Visman

Это я пытался запихать данные из разных таблиц в один столбец, но не вышло smile.gif

Спустя 4 минуты, 16 секунд (4.03.2012 - 15:27) Visman написал(а):
alex12060, как тогда запрос работает? Если там два столбца с одинаковыми именами.

Спустя 25 минут, 7 секунд (4.03.2012 - 15:52) alex12060 написал(а):
Ну вот так и работает.

Спустя 53 минуты, 48 секунд (4.03.2012 - 16:46) neadekvat написал(а):
Шо-то я таки не понимаю.
Вот я добавил "цитированную запись" (не вкурил, что именно это значит), а потом добавил свою. И своя стала выше.
Так и сортируй по дате добавления (DESC). Что еще нужно?

Спустя 19 минут, 7 секунд (4.03.2012 - 17:05) Visman написал(а):
neadekvat, автор наверное хочет, чтобы сортировка по обеим столбцам br.create_date, bc.date шла последовательно как будто это один столбец.

Спустя 50 минут (4.03.2012 - 17:55) neadekvat написал(а):
Цитата (Visman @ 4.03.2012 - 18:05)
neadekvat, автор наверное хочет, чтобы сортировка по обеим столбцам br.create_date, bc.date шла последовательно как будто это один столбец.

Вот бы авторы умели также понятно задавать свои вопросы. А то и код выложат, и простыню текста накатают, а че хотел - непонятно.

Автор, используй UNION.
(SELECT .... ORDER BY date)
UNION
(SELECT .... ORDER BY date)
ORDER BY date


Должно сработать, кажется.

Спустя 15 часов, 42 минуты, 57 секунд (5.03.2012 - 09:38) alex12060 написал(а):
neadekvat

Да, Visman меня правильно понял.

Спустя 1 час, 2 минуты, 8 секунд (5.03.2012 - 10:40) alex12060 написал(а):
Проблему решил костылем.


public static function cmp($a, $b){
if (isset($a['bcit']))
$astamp = strtotime($a['date']);
else
$astamp = strtotime($a['create_date']);

if (isset($b['bcit']))
$bstamp = strtotime($b['date']);
else
$bstamp = strtotime($b['create_date']);

if ($astamp > $bstamp)
return -1;

if ($astamp == $bstamp)
return 0;

if ($astamp < $bstamp)
return 1;
}

usort($res, "Blog::cmp");
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.