Запрос с UNION

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Sparton
Сообщения: 28
Зарегистрирован: 22 фев 2007, 10:38

Запрос с UNION

Сообщение 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

Решил при помощи процедуры, благодарю.
А что значит эта надпись

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 сен 2007, 15:38

Вследствие чего может появляться?
ты статьи на сайте читать будешь? Мог бы и поиском на сайте воспользоваться...

Ответить