Вот запрос, сейчас распишу, что делает и что должен делать.
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
Я могу обсудить этот вопрос с тобой после того, как будет решена моя проблема
Я могу обсудить этот вопрос с тобой после того, как будет решена моя проблема

Спустя 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
Это я пытался запихать данные из разных таблиц в один столбец, но не вышло
Это я пытался запихать данные из разных таблиц в один столбец, но не вышло

Спустя 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). Что еще нужно?
Вот я добавил "цитированную запись" (не вкурил, что именно это значит), а потом добавил свою. И своя стала выше.
Так и сортируй по дате добавления (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 меня правильно понял.
Да, 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");