根据表间匹配的id选择不同的电子邮件

k5ifujac  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(367)

我试图在两个表中提取具有匹配ID的唯一电子邮件。

SELECT line_items.order_id, line_items.id, orders.email, orders.name
FROM orders INNER JOIN
     line_items
     ON orders.id = line_items.order_id
WHERE line_items.order_id IN (SELECT DISTINCT email FROM orders WHERE status = 0 AND created_at BETWEEN '2018-01-10' AND NOW() )
LIMIT 50;

我知道我的错误是基于这样一个事实:行\u items.order\u是一个int,因此in参数正在寻找另一个int列来匹配。但是,我不知道如何修改它以获得正确的结果。非常感谢您的帮助。

rpppsulh

rpppsulh1#

很难理解,但我认为你想要:

SELECT sub.order_id, sub.line_item_id, sub.email, o.name
FROM  
(SELECT o.email, MIN(o.id) AS order_id, MIN(i.id) AS line_item_id
 FROM orders o
 INNER JOIN line_items i
 ON o.id = i.order_id
 WHERE o.status = 0
 AND o.created_at BETWEEN '2018-01-10' AND NOW()
 GROUP BY o.email) sub
LEFT JOIN orders o
ON sub.order_id = o.id

在子查询中,选择每个电子邮件以及第一个订单id和行项目id。然后将其连接回订单以提取订单名称。这确实假设min(行项目)将显示每个电子邮件的min(订单id),因此如果这不是一个有效的假设,您必须让我知道。

5ssjco0h

5ssjco0h2#

我试图在两个表中提取具有匹配ID的唯一电子邮件。
如果您的意思是不同的电子邮件,那么您的子查询将显示为:

SELECT DISTINCT o.email
FROM o.orders
WHERE o.status = 0 AND o.created_at BETWEEN '2018-01-10' AND NOW();

因为一个订单至少应该有一个行项目,我不明白为什么这个表是必要的。
您的查询接近于回答这样一个问题:“为最近发出状态为0的订单的电子邮件拉取所有订单”。如果这是你想要的:

SELECT li.order_id, li.id, o.email, o.name
FROM orders o INNER JOIN
     line_items li
     ON o.id = li.order_id
WHERE o.email IN (SELECT o2.email FROM orders o2 WHERE o2.status = 0 AND o2.created_at BETWEEN '2018-01-10' AND NOW() )
LIMIT 50;

相关问题