MySQL: получить различные, разные, значения между двумя запросами

У меня есть запрос с вложенным запросом. Оба возвращают список идентификаторов пользователей. in inner query дает мне всех клиентов, которые использовали наличные деньги в определенном месте в течение заданного периода времени.

Второй, выбирает все идентификаторы пользователя из первого, который заказал после определенной даты и не использовал наличные деньги в качестве формы оплаты.

select distinct c.user_id
from (
    select distinct o.user_id
    from `order` as o
    inner join payments as p on p.id = o.id
    where o.orderplaced_ts > "2016-01-01 00:00:00"
    and o.store_id = "12"
    and p.payment_method = "Cash"
) as c
inner join `order` as o on c.user_id = o.user_id
inner join `payments` as p on o.id = p.id
where o.orderplaced_ts > "2016-03-13 00:00:00"
and o.store_id = "12"
and p.payment_method != "Cash"

Как я получаю крест между пользователями, которые не заказывали с тех пор 2016-03-13.

Для сравнения:

select distinct o.user_id
from `order` as o
inner join payments as p on p.id = o.id
where o.orderplaced_ts > "2016-01-01 00:00:00"
and o.store_id = "12"
and p.payment_method = "Cash"

Возвращает 236 уникальных идентификаторов-вызов этого набора A

Оба запроса совмещают возврат 160 уникальных ID-вызов этого набора B

Какие идентификаторы находятся в наборе A и notв наборе B

2 ответа

  1. Я бы предпочел получить sqlfiddle с вашей стороны.

    Но так как у меня нет, вот моя попытка:

    select distinct c.user_id
    from (
        select distinct o.user_id
        from `order` as o
        inner join payments as p on p.id = o.id
        where o.orderplaced_ts > "2016-01-01 00:00:00"
        and o.store_id = "12"
        and p.payment_method = "Cash"
    ) as c
    LEFT JOIN `order` as o 
    ON c.user_id = o.user_id
       AND o.orderplaced_ts > "2016-03-13 00:00:00"
       AND o.store_id = "12"
    LEFT JOIN `payments` as p 
    ON o.id = p.id
       AND p.payment_method != "Cash"
    WHERE p.id IS NULL
    
  2. Использование предложения not in между двумя запросами

    select distinct o.user_id
    from `order` as o
    inner join payments as p on p.id = o.id
    where o.orderplaced_ts > "2016-01-01 00:00:00"
    and o.store_id = "12"
    and p.payment_method = "Cash"
    and o.user_id not in (
    
        select distinct c.user_id
        from (
            select distinct o.user_id
            from `order` as o
         inner join payments as p on p.id = o.id
            where o.orderplaced_ts > "2016-01-01 00:00:00"
            and o.store_id = "12"
            and p.payment_method = "Cash"
        ) as c
        inner join `order` as o on c.user_id = o.user_id
        inner join `payments` as p on o.id = p.id
        where o.orderplaced_ts > "2016-03-13 00:00:00"
        and o.store_id = "12"
    
    )