IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Как правильно задать запрос к мускулу (https://www.imho.ws/showthread.php?t=135780)

tod 15.10.2008 23:50

Как правильно задать запрос к мускулу
 
Есть база данных: с полем, которое имеет значения:
ответ11111
ответ11112
ответ11113
ответ11114

ответ11116
ответ11117
ответ11118
ответ11119

Задаю запрос по поиску поля *ответ11115* (которого к примеру, нет в базе)
Мне нужно, чтоб мускул показал мне 2 поля сверху по списку и 2 поля снизу по списку, как бы альтернативу отсуствующему:
ответ11113
ответ11114

ответ11116
ответ11117


Само поле не цифровое, а смешаное..

Может немного сумбурно, но примерно так :)

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

EvroStandart 16.10.2008 11:55

Сомнительно что такое одним запросом возможно оформить.

BorLase 16.10.2008 14:20

можно попробовать что-то типа

select
IFNULL(field,
select field from table where field < 'ответ11115' order by field desc limit 2
union
select field from table where field > 'ответ11115' order by field limit 2)
from table
where field = 'ответ11115'

не могу поручиться за 100% работоспособность (БД под рукой нет, не могу попробовать) - но, по идее, должно сработать нечто типа этого

Hubbitus 16.10.2008 15:18

Цитата:

Сообщение от tod (Сообщение 1598551)
Само поле не цифровое, а смешаное..

Это как? Тип поля какой?


Цитата:

Сообщение от tod (Сообщение 1598551)
Мне нужно, чтоб мускул показал мне 2 поля сверху по списку и 2 поля снизу по списку, как бы альтернативу отсуствующему:

Как алттернативу, это значит их не надо выбирать, если точное соответствие найдено? Или всегда надо +/- 2?

Если я правильно понял, и первое, то можно так:
Код:

SELECT *
FROM imho_ans i2
WHERE Answr = 'ответ11115'
UNION ALL
SELECT *
FROM imho_ans i
WHERE
        NOT EXISTS (
        SELECT ID
        FROM imho_ans i2
        WHERE Answr = 'ответ11114'
        )
        AND ABS(RIGHT(Answr, 5) - RIGHT('ответ11115', 5)) <= 2
ORDER BY Answr

Если второе, то просто этот запрос упрощаете две трети :)

tod 16.10.2008 16:07

суть в том, что если этот запрос идёт, то по условию ответа точно нет...

Как альтернатива - может быть и +\- 1 - не суть важно

Я немного ввёл вас в заблуждение всех неправильно поставленой задачей..

Второй пример поля из этой же задачи.
Ищем запросом поле - .автопром


есть поля:
.авто
.автопроизводитель

.автомобилестроение
.автомобиль


его нет в базе - это уже известно точно, мне нужно, чтоб запрос выдал:
.автопроизводитель

.автомобилестроение

Которые должны были бы стоять в списке до и после слова: .автопром - если бы оно там было..
Вот тут думаю я пояснил правильно...

Hubbitus 16.10.2008 16:13

Цитата:

Сообщение от tod (Сообщение 1598728)
суть в том, что если этот запрос идёт, то по условию ответа точно нет...

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


Цитата:

Сообщение от tod (Сообщение 1598728)
Как альтернатива - может быть и +\- 1 - не суть важно

Безусловно не важно. Для этого просто <=2 надо поменять в запросе на <=1 и все.

Saruman 16.10.2008 18:54

а если поля в базе отсортированы по алфавиту, не проще сделать
Код:

SELECT * FROM items WHERE itemvalue < 'автомобиль' ORDER BY itemvalue DESC LIMIT 2;
SELECT * FROM items WHERE itemvalue > 'автомобиль' ORDER BY itemvalue ASC LIMIT 2;


Hubbitus 16.10.2008 19:24

Цитата:

Сообщение от Saruman (Сообщение 1598774)
а если поля в базе отсортированы по алфавиту

Гыг, так какая разница как поля отсортированы в таблице, если порядок сортировки Вы все равно задаете явно в запросе в виде ORDER BY?

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

P.S. Не хорошо новую постановку задачи дописывать уже после ответа поста :)

Saruman 16.10.2008 21:58

Цитата:

Сообщение от Hubbitus (Сообщение 1598778)
Гыг, так какая разница как поля отсортированы в таблице, если порядок сортировки Вы все равно задаете явно в запросе в виде ORDER BY?

согласен, криво сформулировал. Имелось в виду, если поля, соседние с нужным полем - т.е. те, что нам нужны - суть соседние при алфавитной сортировке. Мало ли там по какому ещё принципу может быть отсортировано всё это дело.
Цитата:

Сообщение от Hubbitus (Сообщение 1598778)
P.S. Не хорошо новую постановку задачи дописывать уже после ответа поста

ну надо же объяснить человеку, что он хочет ;)

Hubbitus 16.10.2008 23:49

Цитата:

Сообщение от Saruman (Сообщение 1598838)
Имелось в виду, если поля, соседние с нужным полем - т.е. те, что нам нужны - суть соседние при алфавитной сортировке.

Трижды перечитал, пока понял что ты сказать хотел :)
В общем разумеется, если подразумевается не алфавитная сортировка (но не похоже чобы это тот случай, особенно в свете примера), то нужно будет вписать корректное условие в ORDER BY, а не просто имя поля для сортировки.


Цитата:

Сообщение от Saruman (Сообщение 1598838)
ну надо же объяснить человеку, что он хочет

Не, я к тому что когда уже ответил на пост, оказалось что тот на который я отвечал изменили. Получилось я отвечал не совсем на то что написано, ну не совсем по теме уже как бы я написал :)
Ладно, не думаю что это было специальо сделано, проехали.


Часовой пояс GMT +4, время: 03:02.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.