Mysql подзапрос: Попытка получить последний заказ от клиента - PullRequest
2 голосов
/ 19 января 2010

Извините, может быть, это тривиально, но я не могу найти способ сделать это:

таблица клиентов

  • customer_id
  • customer_email
  • customer_newsletter (1 = да / 0 = нет)

стол заказов

  • order_id
  • customer_id
  • order_status (1 = ok / 0 = no_ok)

Каждый клиент может иметь ноль, один или несколько заказов.

Я пытаюсь сделать запрос, чтобы получить все электронные письма людей, которые:

1 / еще не клиенты, они никогда не размещали заказ, но хотят получать мою новостную рассылку

или

2 / уже клиенты (один или несколько заказов в соответствующей таблице). Но только если статус их последнего заказа в порядке (Я не хочу отправлять рассылку проблемным клиентам)

Я пробовал несколько вещей, основанных на подзапросах с функцией MAX, но не могу найти хорошую формулировку

Есть совет? заранее спасибо

Ответы [ 4 ]

1 голос
/ 19 января 2010

Предполагая, что вы можете использовать самый большой идентификатор заказа как самый последний, я думаю, что он должен работать:

SELECT c.customer_email
FROM customers c
LEFT OUTER JOIN orders o ON o.customer_id = c.customer_id
WHERE c.customer_newsletter = 1 AND o.customer_id IS NULL
UNION
SELECT c.customer_email
FROM customers c
WHERE customer_id IN 
  (SELECT customer_id FROM orders WHERE order_id IN 
    (SELECT MAX(order_id) FROM orders WHERE order_status = 1 GROUP BY customer_id)
  )
1 голос
/ 19 января 2010

1)

select *
from customers c
where customer_newsletter = 1 and
not exists ( select * from orders o where c.customer_id = o.customer_id )

2)

select *
from customers c
where 1 = ( select order_status from orders o1 
       where o1.customer_id = c.customer_id and 
             o1.order_id = ( select max(order_id) 
                             from orders o2 where o2.customer_id = c.customer_id)
     )
0 голосов
/ 19 января 2010

Чтобы получить клиентов без заказов, которым нужна ваша новостная рассылка, вы можете использовать LEFT OUTER JOIN.

Пример (не проверено):

select c.*
from customers c left outer join orders o
on c.customer_id = o.customer_id
where (o.customer_id is null) and customer_newsletter = 1
order by c.customer_id
0 голосов
/ 19 января 2010
SELECT  customer_email
FROM    customers c
WHERE   customer_newsletter
        AND COALESCE(
        (
        SELECT  order_status
        FROM    orders o
        WHERE   o.customer_id = c.customer_id
        ORDER BY
                o.customer_id DESC, o.date_purchased DESC
        LIMIT 1
        ), 1)

Создайте индекс для orders (customer_id, date_purchased), чтобы это работало быстро. Однако он будет работать даже без индекса.

Если вы хотите, чтобы успешные клиенты получали электронные письма независимо от настроек рассылки, используйте это:

SELECT  customer_email
FROM    customers c
WHERE   COALESCE(
        (
        SELECT  order_status
        FROM    orders o
        WHERE   o.customer_id = c.customer_id
        ORDER BY
                o.customer_id DESC, o.date_purchased DESC
        LIMIT 1
        ), customer_newsletter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...