Добавлять больше колонн в NOT IN MySQL?

Я новый в форуме, он помог мне очень много до сих пор. Но сейчас я не нахожу решение для следующего:

У меня есть таблица в MySQL, названном "события" и другая, названная "транспортные средства", приложение, которое я разрабатываю, - для резерва транспортных средств с PHP и MySQL.

Таблица eventos он содержит: пойдите, fecha_inicio, fecha_fin, hora_inicio, hora_fin, пользователь, транспортное средство

Таблица vehiculos он содержит: пойдите, внеси в списки, модель, казначей.

Когда человек будет реализовывать резерв, система должна распределять ему транспортное средство автоматически (пока ему дали возможность), но для этого я должен знать, что он не размещен в событиях в ранге дат и часов, которые желает пользователь.

У меня есть следующий код:

SELECT vehiculos.matricula
  FROM reservas.vehiculos WHERE vehiculos.matricula NOT IN (
    SELECT vehiculo FROM reservas.eventosv
      WHERE '$aux_ini' >= CONCAT(fecha_ini,' ',hora_ini)
      OR '$aux_fin' <= CONCAT(fecha_fin,' ',hora_fin)
  ) AND habilitado='S' AND zona='Zona1' order by id asc LIMIT 1

Где $ aux_ini и $ aux_fin - дата, я инициализируюсь + час инициализируюсь приложенные и датирует конец + час конец, приложенный.

Оно функционировало правильно до тех пор, пока не были сделаны резервы всех транспортных средств, сейчас не возможно размещать никакого транспортного средства (хотя даты будут отличными), потому что он не замечает второго WHERE ( NOT IN) так как он только позволяет мне выбирать поле. Какое-то решение?

Спасибо заранее.

Приветствие.

Я ИЗДАЮ:

Делая это таким, который я схватил, он возвращает мне все реестры, которые есть в транспортных средствах, потому что уже существуют резервы этих транспортных средств в этих датах, когда то, что я ищу, состоит в том, чтобы он возвратил мне реестр, который не был бы между этими датами, следовательно есть solapamiento, я не понимаю

SET @f_ini = '2018-12-12';
SET @h_ini = '12:00';
SET @f_fin = '2018-12-14';
SET @h_fin = '17:00';

SET @ini = '2018-12-12 08:00:00';
SET @fin = '2018-12-14 08:00:00';

SELECT vehiculos.matricula
  FROM reservas.vehiculos WHERE NOT EXISTS(
    SELECT * FROM reservas.eventosv
      WHERE eventosv.vehiculo = vehiculos.matricula
        AND (   (CONCAT(@f_ini,' ',@h_ini) > @ini AND CONCAT(@f_fin,' ',@h_fin) < @fin)
             OR (CONCAT(@f_fin,' ',@h_fin) > @ini AND CONCAT(@f_ini,' ',@h_ini) < @ini)              
             OR (CONCAT(@f_fin,' ',@h_fin) > @ini AND CONCAT(@f_fin,' ',@h_fin) < @fin)
             )
  ) AND habilitado='S' AND zona='Zona1' order by id asc LIMIT 1
0
задан 12.12.2018, 08:42
3 ответа

Нет, ты не можешь добавлять mГЎs колонны в NOT IN, что он идет сравнивать с оператором IN, так это список элементов. ( https://dev.mysql.com / doc / refman / 8.0 / в / comparison-operators.html#function_in )

, Но всех форм я верю в то, что эта не serГ - в одну soluciГіn в твою проблему. У тебя есть возможные неудачи в консультации, что podrГ-an способствовать тому, чтобы оно не функционировало как ожидание.

  • Она comparaciГіn дат '$aux_ini' >= CONCAT(fecha_ini,' ',hora_ini) podrГ, - чтобы не удаваться в зависимости от формата дат, так как estГЎs сравнивая цепи текста ты не датируешь.

, Чтобы это предотвращать я ты recomendarГ, - чтобы работать даты в формате UNIX , хранившемся в поле INT, у тебя есть программные средства, чтобы относиться к информации так в php ( http://php.net/manual/en/function.strtotime.php и http://php.net/manual/es/function.time.php ) как в mysql ( https://dev.mysql.com / doc / refman / 8.0 / в / date-and-time-functions.html#function_unix-timestamp ) и хотя это жестянка конвертировать это, чтобы это отображать ты зарабатываешь скорость (creaciГіn индексов) и простота (сравнения, суммы и вычитания mГЎs простые)

, Чтобы выходить из сомнений, проверяет результат решения SQL с реальной стоимостью $aux_ini и $aux_fin (покажи это из-за экрана) или tambiГ©n выполни доказательства (опустошив настоящие резервы) без WHERE дат, я верю в то, что obtendrГЎs те же reusultados.

(издал)

, Как показывает Мигель, консультация упрощается, используя NOT EXISTS, но не из-за того, что возвращает mГЎs поля (действительно мы не хотим ни одного), а потому что он упрощается bГєsqueda между датами.

SELECT vehiculos.matricula FROM reservas.vehiculos WHERE NOT EXIST (SELECT * FROM reservas.eventosv WHERE eventosv.vehiculos = vehiculos.matricula AND '$ aux_ini'> = CONCAT (fecha_ini,'', hora_ini) AND '$ aux_fin' < = CONCAT (fecha_fin,'', hora_fin)) уполномоченный AND ='С' AND зона ='Zona1' order by пойдите asc LIMIT

SELECT vehiculos.matricula
  FROM reservas.vehiculos WHERE NOT EXIST(
    SELECT * FROM reservas.eventosv
      WHERE eventosv.vehiculos = vehiculos.matricula
        AND (   (CONCAT(fecha_ini,' ',hora_ini) <= '$aux_ini' AND CONCAT(fecha_fin,' ',hora_fin) >= '$aux_fin')
             OR (CONCAT(fecha_fin,' ',hora_fin) >= '$aux_ini' AND CONCAT(fecha_ini,' ',hora_ini) <= '$aux_fin')
             OR (CONCAT(fecha_fin,' ',hora_fin) <= '$aux_fin' AND CONCAT(fecha_fin,' ',hora_fin) >= '$aux_fin')
 )
  ) AND habilitado='S' AND zona='Zona1' order by id asc LIMIT 1

, Что serГ - в: Дай мне matriculas vehiculos для, которые НЕ СУЩЕСТВОВАЛ один evento из выражения vehiculo между искавшими датами. я изменился OR дат из-за одного AND, чтобы искать между датами, которые я хочу разместить. - aГ±adido три временных совпадения где solaparГ-an даты событий с искавшим резервом.

1
ответ дан 20.11.2019, 02:28
  • 1
    Привет Fly, - то, что я тестирую, кроме того уже я не делаю CONCAT, я это делаю с полями datetime реальные: SELECT vehiculos.matricula, vehiculos.orden, eventosv.fini, eventosv.ffin, vehiculos.habilitado FROM reservas.vehiculos LEFT JOIN reservas.eventosv ON vehiculos.matricula=eventosv.vehiculo WHERE (' 2018-12-13 10:00:00' > = eventosv.ffin OR ' 2018-12-15 12:00:00' < = eventosv.fini) AND (vehiculos.habilitado =' S') AND (vehiculos.zona =' Zona1') ORDER BY eventosv.id DeSC – Hsbrg 12.12.2018, 03:45
  • 2
    edité ответ, смотри новую консультацию. – Fly 12.12.2018, 03:51
  • 3
    Я это протестировал, как ты сказал симулируя даты и часы, которые поместил бы пользователь: SELECT vehiculos.matricula FROM reservas.vehiculos WHERE NOT EXISTS (SELECT * FROM reservas.eventosv WHERE eventosv.vehiculo = vehiculos.matricula AND ' 2018-12-13 09:00:00' > = eventosv.fini AND ' 2018-12-14 12:00:00' < = eventosv.ffin) уполномоченный AND =' S' AND зона =' Zona1' order by пойдите asc LIMIT 1 И он возвращает мне реестр, который имеет событие 2018-12-12 по отношению к 13-12-2018 11:00 12:00, он больше, если я лишаю его LIMIT 1, у меня выходят все реестры – Hsbrg 12.12.2018, 04:06
  • 4
    edité снова..... я думаю, что эта окончательная ;). Перед резервом есть 5 возможностей, которых только два не solapan ты датируешь, я думаю, что эта консультация ищет правильно три случая, которые solapan ты датируешь. – Fly 12.12.2018, 04:15
  • 5
    Fly, функционирует правильно до тех пор, пока я не ввожу дату, ниже первого события SELECT vehiculos.matricula FROM reservas.vehiculos WHERE NOT EXISTS (SELECT * FROM reservas.eventosv WHERE eventosv.vehiculo = vehiculos.matricula AND (eventosv.fini > ' 2018-12-10 09:00:00' AND eventosv.ffin < ' 2018-12-10 12:00:00') OR (eventosv.ffin > ' 2018-12-10 09:00:00') OR (eventosv.ffin > ' 2018-12-10 09:00:00' AND eventosv.ffin < ' 2018-12-10 12:00:00')) уполномоченный AND =' S' AND зона =' Zona1' order by vehiculos.orden asc – Hsbrg 12.12.2018, 06:46

Это conseguГ - таким образом, подтвержденный

SET @ini = '2018-12-13 14:00:00';
SET @fin = '2018-12-14 12:00:00';

SELECT vehiculos.matricula
  FROM reservas.vehiculos WHERE NOT EXISTS(
    SELECT * FROM reservas.eventosv
      WHERE eventosv.vehiculo = vehiculos.matricula
        AND (  (@ini < eventosv.ffin AND @fin > eventosv.fini) OR 
                (@fin < eventosv.ffin AND @ini > eventosv.fini)
             )
  ) AND habilitado='S' AND zona='Zona1' order by vehiculos.orden asc LIMIT 1

Благодаря всем! Особенно в @Fly

1
ответ дан 20.11.2019, 02:28

Я это смог решить таким образом

SELECT eventosv.id,vehiculos.matricula, vehiculos.orden, eventosv.fini, eventosv.ffin, vehiculos.habilitado 
FROM reservas.vehiculos LEFT JOIN reservas.eventosv 
ON vehiculos.matricula=eventosv.vehiculo 
WHERE ('2018-12-13 10:00:00' >= eventosv.ffin OR '2018-12-15 12:00:00' <= eventosv.fini) AND (vehiculos.habilitado='S') AND (vehiculos.zona='Zona1') 
GROUP BY eventosv.id 
ORDER BY eventosv.id DeSC

Проблема сейчас, - что, если транспортное средство было размещено 2 раза в различных датах, если я пробую просить резерв в дате, что уже estГЎ отдельное помещение, я вновь распределяет то же транспортное средство благодаря тому, что он осваивается в первых датах, в которых reservГі и не в последних.

0
ответ дан 20.11.2019, 02:28
  • 1
    Ты не можешь группировать, не нуждаешься в том, чтобы не сравнить ни все события, ни первых ни ú ltimos ¿ какой изюм, если ты хочешь разместить в дате между два события? – Fly 12.12.2018, 03:13