Mysql子查询:尝试从客户处获取最后一个订单

Mysql子查询:尝试从客户处获取最后一个订单,sql,mysql,subquery,Sql,Mysql,Subquery,对不起,也许这很琐碎,但我找不到一个方法来做到: 餐桌客人 客户识别码 客户电子邮件 客户通讯1=是/0=否 表顺序 订单号 客户识别码 订单状态1=ok/0=no\U ok 每个客户可以有零个、一个或多个订单 我正试图查询以下人员的所有电子邮件: 1/还不是客户,他们从未下过订单,但他们希望收到我的时事通讯 或 2/对应表中已有一个或多个订单。 但前提是他们的最新订单状态正常 我不想把时事通讯发给有问题的客户 我尝试了几种基于MAX函数的子查询的方法,但没有找到好的公式 有什么建议吗? 提前谢

对不起,也许这很琐碎,但我找不到一个方法来做到:

餐桌客人

客户识别码 客户电子邮件 客户通讯1=是/0=否 表顺序

订单号 客户识别码 订单状态1=ok/0=no\U ok 每个客户可以有零个、一个或多个订单

我正试图查询以下人员的所有电子邮件:

1/还不是客户,他们从未下过订单,但他们希望收到我的时事通讯

2/对应表中已有一个或多个订单。 但前提是他们的最新订单状态正常 我不想把时事通讯发给有问题的客户

我尝试了几种基于MAX函数的子查询的方法,但没有找到好的公式

有什么建议吗? 提前谢谢

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)
在订单上创建索引客户id、购买日期以便快速运行。然而,即使没有索引,它也可以工作

如果您希望成功的客户接收电子邮件,而不考虑其新闻稿设置,请使用以下选项:

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)

要让没有订单的客户想要您的新闻稿,您可以使用左外连接

未经测试的示例:

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
一,

二,


假设您可以使用最大订单id作为最近的订单id,我认为应该可以:

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)
  )

如果在ORDERS表中包含一个date字段,您的查询就会容易得多。事实上,还有一个date_purchased字段。我认为可以使用类似于选择客户id、订单id、订单状态从订单中获取最后一个订单,其中订单id在选择最大订单id中从订单中获取,订单状态为“1”按客户分组\u id我无法定义或更改表上的索引。我能做到Selects@aSa:更新了答案。即使没有索引,它也能工作。在订单正常的客户中,这只会得到那些想要时事通讯的人。这听起来很合理,但OP只为没有订单的客户指定了该约束。
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)
     )
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)
  )