所以我的一般问题是我有两列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'
如何解决我的排名问题或我的一般问题的任何想法将非常感激。
答案 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
,因为该机制需要特定顺序的数据。您的逻辑也不完整,因为具有一个订单和相同交货日期的多个用户将无法正确计算。