Выборка из бд mysql в заданном направлении
#1

Здравствуйте уважаемые форумчане.
Меня интересует один вопрос, а именно возможно ли указать SELECT в каком направлении выбирать значения ?

К примеру:

Есть числа и они могут быть постоянно разные.
Запрашиваю из бд я их в порядке ORDER BY id числа DESC

20
19
18
17
..
1

и нужно например запросить у бд 5 чисел после 14 по возрастанию, то есть 14,15,16,17,18.

Вопрос - как это сделать ?
Буду заранее благодарен.
Reply
#2

Код:
... WHERE id > 13 ORDER BY id ASC
Reply
#3

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Код:
... WHERE id > 13 ORDER BY id ASC
Большое спасибо за помощь, но не много не то, что я хотел, хотя близко. Я забыл указать, что нужно выбрать данные отсортировав их именно DESC порядком.
Я составил вложенный запрос на выборку. Теоретически вложенный запрос должен с начало отсортировать в ASC порядке числа и затем главный запрос их должен перевернуть(отсортировать) и показать в DESC с помощью перечисления в IN. Запрос даёт результат выборки от самого большого числа inc_ids в таблице до маленького. Я гуглил, но не нагуглил ничего толкового.

PHP код:
SELECT inc_ids\
                    
FROM player_notice \
                    
WHERE \
                    `
player_idx` = '1' AND inc_ids IN \
                        (
SELECT inc_ids \
                            
FROM player_notice \
                            
WHERE `player_idx` = '1' AND inc_ids >= '14' \
                            
ORDER BY inc_ids ASC) \
                    
ORDER BY inc_ids DESC \
                    
LIMIT 5 
Должны вывестись столбцы 14 по 18 и быть отсортированы по убыванию.
Грубо говоря я должен получить результат вложенного запроса в IN такого рода IN(14,15,16,17,1


UPD
Разбил запрос на два отдельных и получил нужный результат, но это не выход. Прыжки по функциям. Методом pawn загнал в IN полученные значения.
Reply
#4

Стоило озвучить то, какие данные у тебя есть и что ты хочешь добиться в результате запроса. Вполне возможно, что есть более оптимальный вариант.

Хотя если задачей является "развернуть" результат, то что мешает сделать это прямо во время его обработки? То бишь:
PHP код:
new i;
cache_get_row_count(i);
for(
-= 1!= -1i--)
{
    ...

Reply
#5

Код:
... WHERE id > 13 ORDER BY id DESC
Код:
SELECT inc_ids\ 
FROM player_notice \ 
WHERE \ 
player_idx=1 AND inc_ids >= 14 \ 
ORDER BY inc_ids DESC \ 
LIMIT 5
Reply
#6

Quote:
Originally Posted by Eims
Посмотреть сообщение
Стоило озвучить то, какие данные у тебя есть и что ты хочешь добиться в результате запроса. Вполне возможно, что есть более оптимальный вариант.

Хотя если задачей является "развернуть" результат, то что мешает сделать это прямо во время его обработки? То бишь:
PHP код:
new i;
cache_get_row_count(i);
for(
-= 1!= -1i--)
{
    ...

Привет Еймс, да, ты прав. Спасибо за ответ. Я пытаюсь сделать банальное постраничное листание. Звучит банально, но в реализацию кнопки "Назад" я никак не мог въехать. Кнопку "Далее "я получал методом выборки последнего полученного индекса ... WHERE id < last_index ORDER BY last_index DESC, а вот с "Назад" такая практика не проходила. Запрос WHERE id > first_index ORDER BY first_index DESC ясное дело выводил от максимального числа в таблице, что не нарушало по идее заданное условие, но не совпадало с тем, что хотел я. Говоря конкретно я дико ступил.
first_index получен первым результатом на странице. last_index соответственно последним. Как рамки для вывода результата. Получать от и до.

Про переворот результата в коде я догадывался, но хотелось возложить эту задача на БД.
Щас сотру весь этот бред в коде и напишу по новой.


UPD:

Сделал с помощью LIMIT отступ и сколько элементов выводить, но есть вопрос. Чем больше записей в таблице, тем большее время бд будет затрачивать на отступ. Выход ли делать подобное через LIMIT ?

Цитата:

Quote:

Выборки со смещением (LIMIT/OFFSET) могут работать очень медленно при больших значениях смещений. Это происходит по причине того, что MySQL перебирает и отбрасывает все строки результата, пока их количество не будет равно значению OFFSET. Например:

SELECT * FROM articles ORDER BY id LIMIT 20000, 20
Такой запрос будет использоваться для показа 1000й страницы статей (по 20 статей на страницу). В таком случае, MySQL переберет и отбросит 20 тыс. записей до того, как вернет 20 нужных нам. Естественно, с ростом номера страницы, запрос будет работать все медленнее.

Reply
#7

Привет.
А что вообще за таблица и сколько в записей планируется?
Просто гораздо проще было бы выгрузить с базы сразу максимальное количество столбцов, а после уже работать с кэшем, чем каждый раз запросами терроризировать БД.
Reply
#8

Quote:
Originally Posted by Eims
Посмотреть сообщение
Привет.
А что вообще за таблица и сколько в записей планируется?
Просто гораздо проще было бы выгрузить с базы сразу максимальное количество столбцов, а после уже работать с кэшем, чем каждый раз запросами терроризировать БД.
Записей планируется много. Таблица с оповещениями для игроков. В одной таблице оповещения для разных игроков. Содержание: дата прихода оповещения, оглавление, текст.
Reply
#9

Подниму. Сейчас меня интересует вопрос на сколько затратно будет использование LIMIT в подобном случае ?

Заранее спасибо. Степашка, так как ты хорошо разбираешься в субд, то желательно хотелось бы и твоё мнение выслушать.
Reply
#10

Quote:
Originally Posted by Mexanizm93
Посмотреть сообщение
Подниму. Сейчас меня интересует вопрос на сколько затратно будет использование LIMIT в подобном случае ?

Заранее спасибо. Степашка, так как ты хорошо разбираешься в субд, то желательно хотелось бы и твоё мнение выслушать.
Разница в скорости будет ощутима только в пределах десятка миллионов записей в выборке.
Reply
#11

Quote:
Originally Posted by Stepashka
View Post
Разница в скорости будет ощутима только в пределах десятка миллионов записей в выборке.
Понятное дело, что столько не будет. Я не волнуюсь теперь.

Всем спасибо ребята. Тему закрываю.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)