在连接对SQL中查找第二个最低值(使用排名)

时间:2015-01-28 01:04:20

标签: mysql join min rank

所以我的一般问题是我有两列order.delivery_date和user_profiles.users,我需要为每个用户找到第二个交付日期(也就是最小值的倒数第二个)。

我尝试了两种解决方案。第一种是尝试排除最小值,如下所示:

SELECT user_profiles.users, min(orders.delivery_date) FROM orders
 LEFT JOIN user_profiles ON user_profiles.user=orders.user_id
 WHERE orders.delivery_date NOT IN (SELECT user_profiles.users, 
  min(orders.delivery_date) FROM orders
  LEFT JOIN user_profiles ON user_profiles.user=orders.user_id
  GROUP BY user_profiles.users)
GROUP BY user_profiles.users

这显然不是一个好的解决方案

然后我尝试在每个用户中创建排名,以确定他们的投放日期。因此,我所要做的就是为每个用户选择排名2。但是我无法产生排名。我的代码如下:

SELECT    orders.delivery_date, user_profiles.user,
( 
            CASE orders.delivery_date 
            WHEN @curType 
            THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @curType := orders.delivery_date END
          ) + 1 AS rank
FROM      orders,
          (SELECT @curRow := 0, @curType := '') r
LEFT JOIN user_profiles ON user_profiles.user=orders.user_id

每次我试图运行它时都会给我这个错误:'on clause'中的未知列'orders.user_id'

如何解决我的排名问题或我的一般问题的任何想法将非常感激。

1 个答案:

答案 0 :(得分:0)

简单规则:永远不要在from子句中使用逗号。

使用cross join编写第二个查询:

SELECT o.delivery_date, p.user,
       (CASE o.delivery_date 
             WHEN @curType 
             THEN @curRow := @curRow + 1 
             ELSE @curRow := 1 AND @curType := o.delivery_date
        END) + 1 AS rank
FROM orders o LEFT JOIN
     user_profiles p
     ON up.user = o.user_id CROSS JOIN
     (SELECT @curRow := 0, @curType := '') vars
ORDER BY p.user, o.delivery_date;

请注意,当您使用变量方法时,您应该有一个明确的order by,因为该机制需要特定顺序的数据。您的逻辑也不完整,因为具有一个订单和相同交货日期的多个用户将无法正确计算。