Идентификация новой записи между двумя таблицами

#mysql

#mysql

Вопрос:

Я хотел бы определить последние (начиная с 60 дней) записи в таблице T1 , которых нет в другой таблице T2 .

Поскольку ‘ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ’ не поддерживается MySQL, я попробовал приведенный ниже код.

Я ожидаю найти в результате запись, из T1 которой я удалил T2 . Текущий код не дает ожидаемого результата.

Что происходит не так?

 SELECT * FROM (

  SELECT store, name, date
  FROM `T1` A
  LEFT JOIN `T2` V
    ON A.name=V.namebis AND A.store=V.storebis

  UNION ALL 

  SELECT store, name, date
  FROM `T1` A
  RIGHT JOIN `T2` V
    ON A.name=V.namebis AND A.store=V.storebis
  WHERE A.name is null

) C
WHERE store IN (NYC, CHICAGO)
  AND (date BETWEEN CURRENT_DATE AND subdate(CURRENT_DATE, 60))
GROUP BY store, name
  

Ответ №1:

Если вы хотите только проверить, какие записи в T1 больше не находятся T2 , вам не нужен a FULL JOIN , вы можете просто использовать a LEFT JOIN и проверить, не существует ли строка в T2 , проверив, являются ли поля в T2 NULL . Обратите внимание, что порядок значений в вашем BETWEEN предложении неверен, наименьшее значение должно быть первым. Я также исправил это ниже.

 SELECT store, name, date
FROM T1 
LEFT JOIN T2 ON T1.name = T2.namebis AND T1.store = T2.storebis
WHERE store IN (NYC, CHICAGO)
  AND (date BETWEEN subdate(CURRENT_DATE, 60) AND CURRENT_DATE)
  AND T2.namebis IS NULL
  

Комментарии:

1. Если я укажу конкретную дату: date='2019-04-08' ваш ответ, похоже, работает. Но не с date BETWEEN CURRENT_DATE AND subdate(CURRENT_DATE, 60)

2. Каким образом это не работает? Можете ли вы показать некоторые примеры данных?

3. Если я укажу конкретную дату: date='2019-04-08' ваш ответ работает, так как я получаю взамен строки. Как ни странно, я не получаю эти строки, когда использую синтаксис: date BETWEEN CURRENT_DATE AND subdate(CURRENT_DATE, 60)

4. @SamanthaAlexandria порядок ваших параметров в BETWEEN неверен, наименьшее значение всегда должно быть первым. Смотрите мое редактирование.

5. @SamanthaAlexandria не беспокойтесь. Я должен был увидеть это раньше.

Ответ №2:

Попробуйте это:

 SELECT store, name, date
FROM T1 
LEFT JOIN T2 
ON (T1.name = T2.namebis AND T1.store = T2.storebis)
WHERE store IN (NYC, CHICAGO)
  AND TIMESTAMPDIFF(DAY, DATE(T1.`date`),CURDATE()) =60
  AND T2.namebis IS NULL