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