Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Sparton
- Сообщения: 28
- Зарегистрирован: 22 фев 2007, 10:38
Сообщение
Sparton » 05 сен 2007, 11:45
Помогите, пожалуйста.
Имеется 1 табл с новостями, 2 табл - с картинкой к этой новости.
Задача: вывести последние 10 новостей в порядке убывания даты публикации, времени публикации. Но первая новость должна обязательно содержать картинку
Вот мой запрос:
Код: Выделить всё
select first 1 skip 0 ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic
from news_info ni
join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
order by ni.data_opub desc, pni.id_id desc, ni.time_opub desc
union all
select first 10 skip 0 ni2.ID, ni2.subject, ni2.data_opub, ni2.time_opub, pni2.ID pic
from news_info ni2
left join pic_news_info pni2 ON (pni2.id_id = ni2.ID)
where ni2.type_info=4
order by ni2.data_opub desc, pni2.id_id desc, ni2.time_opub desc
Не работает. IBExpert сообщает "Token unknown - line 6, char 1.
union".
Подскажите, в чем ошибка?
Версия FB 1.5.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 05 сен 2007, 12:06
Во-первых, синтаксическая. UNION может содержать только один ORDER BY, в конце всей конструкции.
Во-вторых, логическая. Одна и та же новость у тебя будет выведена два раза при использовании UNION ALL, именно та, что с картинкой.
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 05 сен 2007, 12:09
Где в доке написано, что Order By в Union допустим для каждого запроса в отдельности?
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 05 сен 2007, 12:21
Кстати, такой ORDER BY можно обойти для получения адекватного FIRST, только что в голову пришло.
Что-то вроде
Код: Выделить всё
select first 1 ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic
from news_info ni
join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
group by (current_date-ni.data_opub), -pni.id_id, (current_time-ni.time_opub),
ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID
union all ...
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 05 сен 2007, 12:24
У меня в голове получилась вот такая поза в камасутре:
Код: Выделить всё
select first 1
0, ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic
from news_info ni
join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
group by (current_date-ni.data_opub), -pni.id_id, (current_time-ni.time_opub),
ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID
union
select first 10
1, ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic
from news_info ni
left join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
group by (current_date-ni.data_opub), -pni.id_id, (current_time-ni.time_opub),
ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID
order by 1, 4 desc, 5 desc
-
Sparton
- Сообщения: 28
- Зарегистрирован: 22 фев 2007, 10:38
Сообщение
Sparton » 05 сен 2007, 12:54
IBExpert выдал ошибочку
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, char 12.
(.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 05 сен 2007, 15:13
А. Пардон-с. Синтаксис Firebird 2.
Совет -
пиши ХП и не морочь голову.
Однако, настоящие проктологи рекомендуют ещё так попробовать (вроде для 1.5 должно работать)
Код: Выделить всё
select first 1
0, ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic,
(current_date-ni.data_opub), -pni.id_id, (current_time-ni.time_opub)
from news_info ni
join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
group by 7, 8, 9, 2, 3, 4, 5, 6
union
select first 10
1, ni.ID, ni.subject, ni.data_opub, ni.time_opub, pni.ID pic,
(current_date-ni.data_opub), -pni.id_id, (current_time-ni.time_opub)
from news_info ni
left join pic_news_info pni ON (pni.id_id = ni.ID)
where ni.type_info=4
group by 7, 8, 9, 2, 3, 4, 5, 6
order by 1, 4 desc, 5 desc
-
Sparton
- Сообщения: 28
- Зарегистрирован: 22 фев 2007, 10:38
Сообщение
Sparton » 06 сен 2007, 14:50
Решил при помощи процедуры, благодарю.
А что значит эта надпись
Вследствие чего может появляться?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 06 сен 2007, 15:38
Вследствие чего может появляться?
ты статьи на сайте читать будешь? Мог бы и поиском на сайте воспользоваться...