PostgreSQL. Интересная выборка

12
М
На сайте с 05.02.2014
Offline
30
1648

Здравствуйте.

Интересует, можно ли решить задачу средствами SQL-запроса или средствами СУБД.

База данных PostgreSQL.

Пусть таблица состоит из 3 столбцов: id, title, created.

Нужно выбрать записи:

1) отсортировав их по title;

2) взять только те , которые после сортировки окажутся после (ниже) записи с id = 17;

3) взять только 25 записей.

Решение в лоб: выбираем все записи, сортировку организуем в СУБД, а хитрое отсечение с учётом id=17 уже на PHP. При этом из СУБД в PHP может свалится неопределённо большое количество трафика. Хочется этого избежать и отсечь лишнее в самой СУБД.

---------- Добавлено 20.01.2017 в 12:19 ----------

Сразу поясню зачем это надо.

Пишу API для админки.

Sly32
На сайте с 29.03.2012
Offline
303
#1

А прежде чем сразу АПИ писать изучить основы SQL вера не позволяет?

М
На сайте с 05.02.2014
Offline
30
#2

Sly32, знаю SQL несколько лет. Составлял собственные SQL-запросы, занимался оптимизацией, умею читать план запроса. Но именно с такой задачей столкнулся впервые и сходу не могу сообразить.

---------- Добавлено 20.01.2017 в 12:44 ----------

Кроме того, раньше я работал с MySQL. Сейчас СУБД — PostgreSQL. Возможно, в ней есть какие-то особенности, упрощающие решение описанной задачи.

S
На сайте с 17.08.2008
Offline
114
#3
хитрое отсечение с учётом id=17 уже на PHP

Зачем? Закиньте в условие селекта where id > 17

взять только 25 записей.

limit 25

Возможно, в ней есть какие-то особенности, упрощающие решение описанной задачи.

для простых селектов, считай что все бд примерно одинаковы.

М
На сайте с 05.02.2014
Offline
30
#4
smbbws:
Цитата:
Зачем? Закиньте в условие селекта where id > 17

smbbws, к сожалению это не работает. Это было первое, что пришло мне в голову.

Представьте, что у вас следующие записи (я опущу поле created):

1 - Ананас
2 - Баран
17 - Обезьяна

Отсортировать нужно по названию в обратном порядке.

Если вы напишите

SELECT * FROM table WHERE id > 17 ORDER BY title DESC;

, то не получите ни одной записи.

В то же время, отсортированный список выглядит так:

17 - Обезьяна
2 - Баран
1 - Ананас

А значит, в итоговую выборку должны попасть записи

2 - Баран
1 - Ананас

т.к. они идут ниже (после) записи «17 - Обезьяна».

Оптимизайка
На сайте с 11.03.2012
Offline
396
#5


create or replace function myproc() RETURNS SETOF tablename AS
$BODY$
DECLARE
r tablename%rowtype;
it integer;
BEGIN
it := 1;
FOR r IN SELECT * FROM tablename order by title
LOOP
IF r.id <= 17 THEN CONTINUE; END IF;
IF it > 25 THEN EXIT; END IF;
it := it + 1;
RETURN NEXT r;
END LOOP;
END
$BODY$
LANGUAGE plpgsql;


select * from myproc();
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
S
На сайте с 30.09.2016
Offline
469
#6

А если что-то вроде

WHERE STRCMP(title, 'Обезьяна')=-1 LIMIT 25
?
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
danforth
На сайте с 18.12.2015
Offline
153
#7

http://sqlfiddle.com/#!15/0408e5/2


SELECT id, title FROM
(SELECT id, title FROM test ORDER BY title) as SUB
WHERE id > 17 LIMIT 25;

Если я конечно правильно понял. А если нет, то заполните sqlfiddle и скажите, что должно попасть в выборку, а что не должно.

Junior Web Developer
S
На сайте с 30.09.2016
Offline
469
#8

danforth, да ему не надо id>17. ТС просто использует этот элемент для отсечки. Ему надо, чтобы выбрались имена, расположенные по алфавиту до имени, у которого id=17.

B
На сайте с 13.02.2008
Offline
262
#9

Маркус, А в чем проблема?

Первым коротким запросом получаете title строки с id=17:


SELECT title FROM test WHERE id = 17;

Например, получаете: обезьяна.

А вторым запросом получаете выборку:

SELECT * FROM test WHERE title < "обезьяна" ORDER BY title DESC LIMIT 25;
A
На сайте с 19.07.2010
Offline
130
#10

SELECT * FROM tbl
where title < (select title from tbl where id=17)
order by title desc
limit 25

проверил, работает(mysql). думаю для постгресса тоже подойдет.

.............
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий