Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Составить SQL запрос для получения поля из строки по условию и другого поля из следующей строки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
TuX560
Отправлено: 11 Марта, 2016 - 13:25:49
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Доброго всем дня. Проблема в следующем, есть таблица поля которой id - первичный ключ с автоинкриментом и уникальное текстовое поле. нужно получить id по текстовому полю и выдать текстовое поле из следующей записи. в данный момент выглядит примерно так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM TABLE WHERE text='text';
  2. SELECT text FROM TABLE WHERE id > <ранее полученный id> ORDER BY id ASC LIMIT 1

id текущей записи тоже необходимо получить для дальнейших действий
Возможно ли запихать все это в один запрос и будет ли это быстрее работать чем 2 отдельных запроса? Для работы с БД используется mysqli
(Добавление)
upd. И как это лучше реализовать/оптимизировать?
(Добавление)
upd2 и да, реализовать нечто подобное мне все же удалось:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, (SELECT DISTINCT id FROM TABLE WHERE text = 'text') AS old_id, text FROM TABLE HAVING old_id < id ORDER BY id ASC LIMIT 1

Но:
1. если верить профилировщику mysql это работает медленне чем 2 отдельных запроса
2. присутствует лишний id следующей записи от которого мне так и не удалось избавиться.
В mysql не силен, поэтому просьба сильно не пинать.
 
 Top
OrmaJever
Отправлено: 11 Марта, 2016 - 14:10:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




что-то мне подсказывает что 2 запроса тут будут в любом случае лучше. Можно конечно попробовать сделать через join или вложеный запрос (типа вашего варианта), но как-то это всё не очень


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Марта, 2016 - 14:26:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, text FROM TABLE WHERE id >= (SELECT id FROM TABLE WHERE text='text') ORDER BY id ASC LIMIT 2

Вот так можно. Будет две строки в выборке. Можно выбирать ещё какие-нибудь полезные данные.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT tablename.text, tablename.id, origt.id FROM (SELECT id FROM TABLE WHERE text='text') origt JOIN TABLEname ON tablename.id > origt.id ORDER BY id ASC LIMIT 1

Или вот так. Вроде тоже адекватно сработает.
explain'ы надо глядеть. Два раздельных запроса на самом деле могут быть быстрее.


-----
PostgreSQL DBA
 
 Top
TuX560
Отправлено: 14 Марта, 2016 - 08:12:17
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Спасибо, идея сделать
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, text FROM TABLE WHERE id >= (SELECT id FROM TABLE WHERE text='text') ORDER BY id ASC LIMIT 2

была самой первой, но смутило то что в ответе мы получаем в 2 раза больше чем необходимо. Мне уже так же кажется, что быстрее, проще и понятнее будет оставить 2 запроса.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB