Невозможно вернуть запись, соответствующую условию - PullRequest
0 голосов
/ 31 марта 2019

У меня есть таблица, которая содержит список match:

id        |  datetime 
 2864049     2019-04-03 00:00:00
 2864050     2019-04-03 00:00:00
 2864051     2019-04-03 00:00:00

По сути, я должен проверить, существует ли он и нужно ли его обновлять, для этого я сделал:

SELECT mm.match_id
FROM (SELECT 2864049 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime UNION ALL 
      SELECT 2864050 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime UNION ALL 
      SELECT 2864051 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime
     ) mm LEFT JOIN
     `match` m
     on m.id = mm.match_id AND m.datetime <> mm.match_datetime
WHERE m.id IS NULL

Проблема заключается в том, что этот запрос не должен возвращать никакого результата, поскольку все три match существуют, а также имеют поле datetime, равное matches, указанному в таблице mm.

Запрос должен возвращать результат, только если datetime отличается или match не существует.

Что я сделал не так?

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Переместить другую дату туда, где предложение

Текущий тест: http://sqlfiddle.com/#!9/ee7ffb/1

CREATE TABLE `match`
    (`id` int, `datetime` datetime)
;

INSERT INTO `match`
    (`id`, `datetime`)
VALUES
    (2864049, '2019-04-03 00:00:00'),
    (2864050, '2019-04-03 00:00:00'),
    (2864051, '2019-04-03 00:00:00'),
    (2864052, '2019-04-03 00:00:00'),
    (2864053, '2019-04-03 00:00:00'),    
    (2864054, '2019-04-03 00:00:00')        
;



SELECT m.id, `datetime`
FROM 
`match` `m`
left join  
     (SELECT 2864049 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime UNION ALL 
      SELECT 2864050 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime UNION ALL 
      SELECT 2864051 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime union all
      SELECT 2864052 as match_id, CAST("2019-04-04 00:00:00" AS DATETIME) AS match_datetime union all
      SELECT 2864054 as match_id, CAST("2019-04-03 00:00:00" AS DATETIME) AS match_datetime  
     ) mm 
     on m.id = mm.match_id 
WHERE 
mm.match_id IS NULL -- not existing
or m.datetime <> mm.match_datetime -- move to where clause

Вывод:

|      id |             datetime |
|---------|----------------------|
| 2864052 | 2019-04-03T00:00:00Z |
| 2864053 | 2019-04-03T00:00:00Z |

2864052, несмотря на наличие соответствующего идентификаторапоскольку его дата и время отличаются от мм

2864053, так как он не существует в мм

0 голосов
/ 31 марта 2019

попробуйте преобразовать дату, не используя приведение, но STR_TO_DATE

SELECT mm.match_id
FROM (SELECT 2864049 as match_id, str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' ) AS match_datetime 
      UNION ALL 
      SELECT 2864050 , str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' )  
      UNION ALL 
      SELECT 2864051 , str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' )
     ) mm 
LEFT JOIN  `match` m on m.id = mm.match_id AND m.datetime <> mm.match_datetime
WHERE m.id IS NULL

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

SELECT mm.match_id
FROM (SELECT 2864049 as match_id, str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' ) AS match_datetime 
      UNION ALL 
      SELECT 2864050 , str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' )  
      UNION ALL 
      SELECT 2864051 , str_to_date("2019-04-03 00:00:00", '%Y-%m-%d %T' )
     ) mm 
LEFT JOIN  `match` m on m.id = mm.match_id AND m.datetime =  mm.match_datetime
WHERE m.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...