【问题标题】:How can I select the second minimal value within a inner join?如何在内部联接中选择第二个最小值?
【发布时间】:2017-01-10 02:05:30
【问题描述】:

我有这个问题

select c.id, c.name, c.email, c.totalpets, min(p.date_created) as first_order,
min(p.weight) as min_weight_bought,
max(p.weight) as max_weight_bought,
count(p.ordernumber) as total_orders
from orders p
inner join customers c
on p.customer_id = c.id
where p.approved = 1
and c.totalpets >= 1
group by c.id
having total_orders > 1

请注意,first_order 给了我该行的第一个结果,对吗?我正在尝试获得客户第一订单和客户第二订单。我怎样才能在这个内部连接中做到这一点?

谢谢

【问题讨论】:

  • 您应该只选择出现在GROUP BY 子句中的聚合和列,因此查询应该是SELECT c.id, MIN(p.date_created) FROM orders ... GROUP BY c.id
  • 我不知道我是否明白。您的意思是带有这些参数的子查询?
  • 不,我没有给出答案,我只是在纠正您原始查询的问题。

标签: mysql subquery max inner-join min


【解决方案1】:
SELECT c1.id,
       c1.name,
       c1.email,
       c1.totalpets,
       p1.date_created
FROM orders p1
INNER JOIN customers c1
    ON p1.customer_id = c1.id
WHERE 
(
    SELECT COUNT(*)
    FROM orders p2
    INNER JOIN customers c2
        ON p2.customer_id = c2.id
    WHERE c2.id = c1.id AND p2.date_created <= p1.date_created
) <= 2 
ORDER BY c1.id;

这是一个正在运行的演示,它显示了上述查询(和简化的数据集)的简化版本:

SQLFiddle

【讨论】:

  • 蒂姆,我会试试这个。感谢您的回答。
  • @HenriqueM。我的查询似乎有效,因为它返回每个客户最低的两个创建日期。如果您希望结果中包含其他聚合(例如购买的最小和最大重量),那么您可以尝试将第二个查询加入到上述查询中,因为我的查询不使用聚合。
  • 我不知道如何让它发生 :( 对我来说,这似乎是在行中给出两个结果,正如我期望在列中一样。另外,我怎样才能添加所需的列我已经回过头来询问这个问题,而没有打扰你的问题?
  • 这是一个 Fiddle,它在一条记录中给出了第一个和第二个订单日期:SQLFiddle。正如我已经提到的,对于您的其他列,只需将第二个查询加入到此结果中。
  • 你救了我的命。我管理了如何包含其他列,只是一个我看不到的过滤器:仅过滤具有> 1个订单的客户,这样第一和第二个订单不应该是相同的
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 2021-07-23
  • 2019-10-10
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
相关资源
最近更新 更多