Подзапрос или Join, который является оптимальным решением? - PullRequest
0 голосов
/ 02 марта 2011

У меня есть 2 таблицы, 1 таблица пользователей и таблица, в которой
исходящие электронные письма стоят в очереди.Я хочу выбрать пользователей
, которые не находятся в сети в течение определенного времени
, и отправить им электронное письмо.Я также хочу, чтобы, если они
уже получили такое письмо за последние 7 дней
или получили запланированное письмо на следующие 7 дней,
они не были выбраны.

У меня есть 2 запроса, и я думаю, что было бы замечательно, если бы
они работали с подзапросами.

Как область, в которой я не являюсь экспертом, я бы
хотел бы пригласить вас либо

  1. Создать подзапрос второго запроса
  2. Сделайте JOIN и исключите результаты второго запроса.

Я был бы гораздо более счастлив, чем счастлив :)

Спасибо, что прочитали

SELECT
    `user_id`
FROM
    `user`
WHERE
    DATEDIFF( CURRENT_DATE(), date_seen ) >= 7 

Результаты второго запроса должны быть исключены
из запроса выше.

SELECT 
    `mail_queue_id`,
    `mail_id`,
    `user_id`,
    `status`,
    `date_scheduled`,
    `date_processed`
FROM
    `mail_queue`
WHERE
    ( 
        DATEDIFF( CURRENT_DATE(), date_scheduled ) >= 7 
            OR
        DATEDIFF( date_scheduled, CURRENT_DATE() ) <= 7
    )
    AND
    (

        `mail_id` = 'inactive_week'

        AND
        (
            `status` = 'AWAITING'
            OR
            `status` = 'DELIVERED'
        )

    )

РЕШЕНИЕ

SELECT
    `user_id`
FROM
    `user` as T1
WHERE
    DATEDIFF( CURRENT_DATE(), date_seen ) >= 7 
    AND NOT EXISTS
    (

        SELECT 
            `user_id`    
        FROM
            `mail_queue` as T2
        WHERE
            T2.`user_id` = T1.`user_id`
            AND
            (

                DATEDIFF( CURRENT_DATE(), date_scheduled ) >= 7 
                    OR
                DATEDIFF( date_scheduled, CURRENT_DATE() ) <= 7

                AND
                (

                    `mail_id` = 'inactive_week'

                    AND
                    (
                        `status` = 'AWAITING'
                        OR
                        `status` = 'DELIVERED'
                    )


                )



            )


    )

1 Ответ

1 голос
/ 02 марта 2011

ВЫ можете выбрать пользователей, которые соответствуют первому критерию (не вошли в систему в течение последних семи дней), а затем «И» этому критерию в другом предложении, используя «НЕ СУЩЕСТВУЕТ», используя псевдоним той же таблицы:

        select * from T where {first criterion}
        and not exists
        (
          select  * from T as T2 where T2.userid = T.userid
          and ABS( DATEDIFF(datescheduled, CURRENT_DATE()) ) <=7

       )

Я не знаком с нюансами mysql DATEDIFF, т. Е. Имеет ли значение, какое значение даты появляется в какой позиции, но абсолютное значение сделает так, чтобы, если бы пользователю было отправлено уведомление в последние 7дней или планируется получить уведомление в течение следующих семи дней, они будут удовлетворять условию и, следовательно, не выполнят условие НЕ СУЩЕСТВУЕТ, исключая этого пользователя из вашего окончательного набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...