Страница 1 из 1

Запрос с UNION

Добавлено: 05 сен 2007, 11:45
Sparton
Помогите, пожалуйста.
Имеется 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.

Добавлено: 05 сен 2007, 12:06
WildSery
Во-первых, синтаксическая. UNION может содержать только один ORDER BY, в конце всей конструкции.
Во-вторых, логическая. Одна и та же новость у тебя будет выведена два раза при использовании UNION ALL, именно та, что с картинкой.

Добавлено: 05 сен 2007, 12:09
Merlin
Где в доке написано, что Order By в Union допустим для каждого запроса в отдельности?

Добавлено: 05 сен 2007, 12:21
WildSery
Кстати, такой 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 ...

Добавлено: 05 сен 2007, 12:24
WildSery
У меня в голове получилась вот такая поза в камасутре:

Код: Выделить всё

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

Добавлено: 05 сен 2007, 12:54
Sparton
IBExpert выдал ошибочку
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, char 12.
(.

Добавлено: 05 сен 2007, 15:13
WildSery
А. Пардон-с. Синтаксис 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

Добавлено: 06 сен 2007, 14:50
Sparton
Решил при помощи процедуры, благодарю.
А что значит эта надпись

Код: Выделить всё

lock conflict on no wait transaction.
Вследствие чего может появляться?

Добавлено: 06 сен 2007, 15:38
kdv
Вследствие чего может появляться?
ты статьи на сайте читать будешь? Мог бы и поиском на сайте воспользоваться...