2016-10-24 2 views
0

Я хочу, чтобы запустить один SQL запрос на основе первого COUNT запросов SQL:Выполнить SQL заявление на основе подсчета SQL

SET @result = "SELECT count(*) FROM ip_addresses WHERE id > (SELECT id FROM ip_addresses WHERE in_use=1) ORDER BY id LIMIT 1" 
CASE WHEN (@result > 0) 
    THEN SELECT * FROM ip_addresses WHERE id > (SELECT id FROM ip_addresses WHERE in_use=1) ORDER BY id LIMIT 1 
    ELSE SELECT * FROM ip_addresses WHERE in_use!=1 ORDER BY id LIMIT 1 
END 

В основном то, что я пытаюсь сделать это, я хочу, чтобы получить следующую запись in_use=0 из WHERE in_use=1. И если запись in_use=1 является последней записью таблицы, она должна получить первую запись таблицы с in_use=0. Больше объяснений: если ip_addresses таблица имеют следующие данные

id|  ip  |in_use 
1 | 192.168.1.5|1 
2 | 89.58.1.2 |0 
3 | 58.98.58.6 |0 

Теперь он должен вернуть вторую запись.

И если ip_addresses таблица имеют следующие данные

id|  ip  |in_use 
1 | 192.168.1.5|0 
2 | 89.58.1.2 |0 
3 | 58.98.58.6 |1 

Теперь он должен возвращать первую запись.

+0

В английском, что вы после? IP самого низкого ID не используется? – xQbert

+0

@xQbert проверить мои обновления в вопросе – hmd

+0

в его текущем запросе, если средний ip используется, последний ip будет возвращен, а не первый. – Andreas

ответ

1

У вас есть несколько вопросов. Наиболее важным является то, что логика управления потоком допускается только в блоках программирования.

Однако вы можете выполнить то, что хотите, с помощью одного запроса. Например:

(SELECT ia.*, 1 as priority 
FROM ip_addresses ia 
WHERE id > (SELECT id FROM ip_addresses WHERE in_use = 1) 
ORDER BY id 
LIMIT 1 
) 
UNION ALL 
(SELECT ia.*, 2 as priority 
FROM ip_addresses ia 
WHERE in_use <> 1 
ORDER BY id 
LIMIT 1 
) 
ORDER BY priority 
LIMIT 1 
+0

Это работает! Спасибо чувак! – hmd

0

Опираясь на ответ xQbert в:

select IP 
from (select case when id > 
     (select min(ID) 
      from IP_ADDRESES 
      where in_use = 1) 
     then ID - (select max(ID) from IP_ADDRESES) 
     else id 
     end case 
    from IP_ADDRESES as deflated_id, 
    ip) 
order by deflated_id asc 
top 1 
+0

Спасибо за ваше время, но я получил синтаксическую ошибку – hmd

0
SELECT A.IP 
    FROM IP_Addresses A, 
     (SELECT min(ID) mid 
      FROM IP_ADDRESES 
      WHERE in_use= 0 
     ) B 
WHERE A.id = B.mid; 
+0

спасибо, но вернул мне первую запись таблицы, в то время как у меня есть in_use = 0 запись рядом с in_use = 1 запись – hmd

+0

Измените свой ответ, чтобы включить дополнительную информацию. Только код и ответы «попробуйте» не рекомендуется, потому что они не содержат содержимого, доступного для поиска, и не объясняют, почему кто-то должен «попробовать это». – BrokenBinary

Смежные вопросы