Как реализовывать один ВСТУПИЛО В БРАК с информацией, которая не существовала бы в таблице MySQL?

Я помещу простой пример того, что я хочу сделать, у меня есть таблица Usuarios которая становится отвечающей современным требованиям каждые 90 секунд в этом примере, у таблицы будет следующая информация:

Usuarios

Nombre    Puerto      Ip
  Juan        4      192.168.1.1
  Juan        9      192.168.1.1
  Jorge       8      192.168.1.2
  Roberto     3      192.168.1.1

Но в каком-то обновлении ему может удаваться иметь следующую информацию:

Usuarios

    Nombre    Puerto      Ip
      Juan        4      192.168.1.1
      Juan        9      192.168.1.1
      Jorge       2      192.168.1.2
      Jorge       8      192.168.1.2
      Roberto     3      192.168.1.1
      Roberto     7      192.168.1.1

Чтобы знать, в котором команда находит каждого пользователя, я делаю следующую консультацию:

 Select Nombre, Puerto, Ip,
         CASE WHEN Nombre='Juan' and Puerto>5 and Ip='192.168.1.1' THEN '20' ELSE
         CASE WHEN Nombre='Juan' and Puerto<6 and Ip='192.168.1.1' THEN '19' ELSE
         CASE WHEN Nombre='Jorge' and Puerto>5 and Ip='192.168.1.2' THEN '18' ELSE
         CASE WHEN Nombre='Jorge' and Puerto<6 and Ip='192.168.1.2' THEN '17' ELSE
         CASE WHEN Nombre='Roberto' and Puerto>5 and Ip='192.168.1.1' THEN '16' ELSE
         CASE WHEN Nombre='Roberto' and Puerto<6 and Ip='192.168.1.1' THEN '15'
         END END END END END END AS Equipo
From Usuarios
Order by Usuarios Desc

Мой результат считая ее первой таблица - следующий:

Nombre    Puerto      Ip              Equipo
  Juan        9      192.168.1.1        20 
  Juan        4      192.168.1.1        19    
  Jorge       8      192.168.1.2        18
  Roberto     3      192.168.1.1        15

Поскольку они могут наблюдать, опусти Команды 17 и 16, так как он не выполняется case, тогда я хочу реализовать консультацию, в которой я идентифицировался бы, что команды находятся, не используя чего-то как это:

Nombre    Puerto      Ip              Equipo    Estado
  Juan        9      192.168.1.1        20      En_uso
  Juan        4      192.168.1.1        19      En_uso
  Jorge       8      192.168.1.2        18      En_uso
  Jorge       2      192.168.1.2        17      Sin_usar
  Roberto     7      192.168.1.1        16      Sin_usar
  Roberto     3      192.168.1.1        15      En_uso

Но поскольку таблица становится отвечающей современным требованиям, и когда команды не в использовании, просто не существует Ваша информация в таблице не, как делание этого.

PD: Таблица - простой пример, так что они проигнорировали логику информации о таблице, таблица, с которой я работаю, не была реализована мной

1
задан 29.12.2016, 21:51
0 ответов

Вместо того, чтобы реализовывать CASE с единственной таблицей, помести условия в другую таблицу и потом ты делаешь сравнения. Немного более или менее как следующее:

SELECT Rangos.Nombre, Rangos.IP, Usuarios.Puerto, Rangos.Equipo, IF(ISNULL(Usuarios.Puerto),'Sin_usar','En_uso') Estado
FROM
(
    SELECT 'Juan' Nombre, '192.168.1.1' IP, 1 PuertoInicial, 5 PuertoFinal, '19' Equipo
    UNION ALL
    SELECT 'Juan', '192.168.1.1', 6 , 999, '20'
    UNION ALL
    SELECT 'Jorge', '192.168.1.2', 1 , 5, '17'
    UNION ALL
    SELECT 'Jorge', '192.168.1.2', 6 , 999, '18'
    UNION ALL
    SELECT 'Roberto', '192.168.1.1', 1 , 5, '15'
    UNION ALL
    SELECT 'Roberto', '192.168.1.1', 6 , 999, '16'
) Rangos LEFT JOIN Usuarios 
ON BINARY Rangos.Nombre = BINARY Usuarios.Nombre AND BINARY Rangos.IP = BINARY Usuarios.IP AND Usuarios.Puerto BETWEEN Rangos.PuertoInicial AND Rangos.PuertoFinal

Это консультируется он был бы должен бросать следующий результат:

Nombre  IP          Puerto    Equipo  Estado
Juan    192.168.1.1 4         19      En_uso
Juan    192.168.1.1 9         20      En_uso
Jorge   192.168.1.2 8         18      En_uso
Roberto 192.168.1.1 3         15      En_uso
Jorge   192.168.1.2           17      Sin_usar
Roberto 192.168.1.1           16      Sin_usar
1
ответ дан 03.12.2019, 17:56
  • 1
    Спасибо за ответ @Weimar в моменте я приспособлю консультацию к моей первоначальной таблице только у меня есть сомнение относительно твоего примера, если бы приняла во внимание ее 1er таблица, что я поместил в мой пример поля ´ Nombre´ ´ IP´ результата твоей консультации tambié n saldrí an vací вы как поле ´ Puerto´ правда? –  29.12.2016, 18:39
  • 2
    Если вопрос - что, если ты используешь Пользователи. Имя вместо Рангов. Имя для конечного результата. Ответ ДА, ты saldrí an недействительные tambié n. –  29.12.2016, 19:27
  • 3
    Кондор, если ответ ты sirvió пожалуйста má rcala как правильная. Спасибо. –  29.12.2016, 19:28
  • 4
    Как не, что ты сделал ему корректирования к консультации, он difí cil знать, что он происходит, но из-за того, что ты показываешь меня, он может состоять в том, чтобы в консультации ты использовал INNER JOIN вместо LEFT JOIN, или ты это вложил así Пользователи LEFT JOIN Ранги то, что также ты не функционировало бы. –  29.12.2016, 21:08
  • 5
    Если ты можешь посылать меня или обновлять твой вопрос с реальной консультацией, которая у тебя есть в этом моменте, мне quedarí в больше fá cil ты сотрудничать. –  29.12.2016, 21:33