Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как создать чередующийся запрос?  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 691
Всем привет, есть табличка:

ид, заголовок, текст, тип_записи(1 - статья, 2 - интервью)
можно ли выбрать данные таким образом:

1, статья 1 |
55, статья 2 |
3, интервью 1 |
40, статья 3 |
5, статья 4 |
30, интервью 2 |
....

строгой последовательности в айдишках между типами записей нет

мне на сайт нужно вывести сетку из трех колонок - две статьи, третья интервью и так далее:

К сообщению приложен файл. Размер - 32Kb
4 окт 16, 10:42    [19740562]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
кролик-зануда
Guest
Sputnick,
можно. нужно только понять, почему статьи и интервью должны быть именно в указанной вами последовательности.
а нужно эту задачу решать именно на уровне БД?
4 окт 16, 10:50    [19740607]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 691
кролик-зануда
Sputnick,
можно. нужно только понять, почему статьи и интервью должны быть именно в указанной вами последовательности.


ну я же написал и скрин даже дал - чтобы вывести на странице сайта в сетке последние статьи в три колонки, а третья колонка должна быть интервью



кролик-зануда
Sputnick,
а нужно эту задачу решать именно на уровне БД?


очень бы хотелось решить на уровне БД, так как изменить всего лишь запрос нужно будет, а если на уровне сайта, то в представление нужно будет посылать массив из двух заполненных моделей и в цикле их обрабатывать, это мне кажется сложнее.
4 окт 16, 11:01    [19740693]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Sputnick,

create table #temp (id int, name nvarchar(10))
insert #temp values 
(1, N'статья 1'), 
(55, N'статья 2'),
(3, N'интервью 1'),
(40, N'статья 3'),
(5, N'статья 4'),
(30, N'интервью 2'),
(33, N'интервью 3'),
(34, N'интервью 4')

select * 
from (
	select *,
		row_number() over (partition by [column] order by name) rown 
	from 
		(select name, 
			case when type = 1 then iif(((rn/2*2) = rn), 'column 1' , 'column 2') else 'column 3' end [column]
		from (
			select *, 
				row_number() over(partition by type order by name desc) rn		
			from (select 
						*,case when name like N'статья%' then 1 else 2 end [type] 
					from #temp) t) a) b) p
pivot (max(name) for [column] in ([column 1] , [column 2], [column 3]))pvt
4 окт 16, 11:19    [19740800]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
buven
Member

Откуда:
Сообщений: 792
Sputnick
ну я же написал и скрин даже дал - чтобы вывести на странице сайта в сетке последние статьи в три колонки, а третья колонка должна быть интервью

Вопрос в том - почему у вас в строке к статья1 и статья2 идет именно интервью1, а не интервью3, например?
И что делать, если интервью больше чем статей?
4 окт 16, 11:26    [19740841]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 691
WarAnt
Sputnick,

create table #temp (id int, name nvarchar(10))
insert #temp values 
(1, N'статья 1'), 
(55, N'статья 2'),
(3, N'интервью 1'),
(40, N'статья 3'),
(5, N'статья 4'),
(30, N'интервью 2'),
(33, N'интервью 3'),
(34, N'интервью 4')

select * 
from (
	select *,
		row_number() over (partition by [column] order by name) rown 
	from 
		(select name, 
			case when type = 1 then iif(((rn/2*2) = rn), 'column 1' , 'column 2') else 'column 3' end [column]
		from (
			select *, 
				row_number() over(partition by type order by name desc) rn		
			from (select 
						*,case when name like N'статья%' then 1 else 2 end [type] 
					from #temp) t) a) b) p
pivot (max(name) for [column] in ([column 1] , [column 2], [column 3]))pvt


ого, спасибо. Блин я немного с табличкой ошибка, я меня есть отдельное поле тип_записи(1 - статья, 2 - интервью), данные так выглядят:


create table #temp (id int, name nvarchar(10))
insert #temp values 
(1, N'статья 1', 1), 
(55, N'статья 2', 1),
(3, N'интервью 1', 2),
(40, N'статья 3', 1),
(5, N'статья 4', 1),
(30, N'интервью 2', 2),
(33, N'интервью 3', 2),
(34, N'интервью 4', 2)
4 окт 16, 11:28    [19740857]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 691
buven
Sputnick
ну я же написал и скрин даже дал - чтобы вывести на странице сайта в сетке последние статьи в три колонки, а третья колонка должна быть интервью

Вопрос в том - почему у вас в строке к статья1 и статья2 идет именно интервью1, а не интервью3, например?
И что делать, если интервью больше чем статей?


так это название, не важно, там уже тысячи записей, мне нужно последних 50 отобрать и показать. Я возьму по orderby rec.DateTimePublish descending и все
4 окт 16, 11:31    [19740884]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Sputnick,

ну дальше сами подправьте как надо.
4 окт 16, 11:32    [19740894]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 691
WarAnt, спасибо большое.
4 окт 16, 11:36    [19740937]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4823
WarAnt
Sputnick,

(rn/2*2) = rn


эквивалентно
rn % 2 = 0
4 окт 16, 12:15    [19741251]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
;with preSel as(
select 0 tt
,ROW_NUMBER() over (order by name) rn
,ID
,name
from #temp
where name like 'статья%'
union all
select 1 tt
,ROW_NUMBER() over (order by name) rn
,ID
,name
from #temp
where name like 'интервью%'
)
select ID,Name
from preSel
order by case when tt=0 then rn  else (rn*2)+0.5 end
4 окт 16, 16:20    [19742820]     Ответить | Цитировать Сообщить модератору
 Re: Как создать чередующийся запрос?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
a_voronin
WarAnt
Sputnick,

(rn/2*2) = rn


эквивалентно
rn % 2 = 0


согласен, но идеальные варианты кода я пишу только для себя либо за деньги:)
4 окт 16, 16:25    [19742851]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить