#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