2011-11-02 128 views
0

我在这一块上碰到了一堵砖墙,希望有人比我更聪明,可以指向正确的方向吗?MySQL-MAX在左连接表

我有一个包含订单的ORDERS表(令人惊讶)。

我也有一个DOWNLOADS表。 DOWNLOADS包含一个ORDERID字段,它是订单表的ID。

DOWNLOADS有一个ATTEMPT字段。每次下载都会在下载中创建一条记录,并且每条记录都会增加ATTEMPT中的值。

我只是想在尝试MAX值,所以我可以告诉用户什么企图他们(或他们已经离开多少次尝试)。

下载可能或可能不会有任何相关记录,这取决于如果用户还没有尝试下载。每次下载尝试时,都会在下载中创建一条记录。

所以在简单的话来说,我试图做一些事情,如:

SELECT orders.*,MAX(downloads.attempt) 
FROM orders 
LEFT JOIN downloads on downloads.orderid = orders.id 
WHERE orders.userid = '123' 

或者更确切地说,我试图让所有的用户命令,以下载尝试的MAX任何地方下载尝试(下载量记录)存在 - 如果没有,则为null。

我已经通过计算器会整天在看类似的例子,但不知何故所有类似的例子是大量复杂。有没有一个简单的(或至少是优雅的)做到这一点?

有点帮助将非常感激。

谢谢。

回答

1

试试这个 -

SELECT orders.userid, MAX(downloads.attempt) 
FROM orders 
LEFT JOIN downloads on downloads.orderid = orders.id 
group by orders.userid 
-2

试试这个:

SELECT orders.userid,MAX(IFNULL(downloads.attempt,0)) 
FROM orders 
LEFT JOIN downloads on downloads.orderid = orders.id 
GROUP BY orders.userid 
+0

你必须对所有非聚合列组,因此,除非“订单”只包括“用户id”这不是一个正确的查询。 –

+0

显然,那里有点疏忽。答案已更新。 – StevieG

+0

好吧。这是一个错误,虽然经常发生,所以我不得不低调;)。也许最糟糕的部分是MySQL接受它,即使结果未定义。 –

0
SELECT orders.*,MAX(downloads.attempt) FROM orders 
LEFT OUTER JOIN downloads on downloads.orderid = orders.id 
WHERE orders.userid = '123' 
GROUP BY orders.id 
+0

您必须使用LEFT OUTER JOIN和在组中按订单ID对所有行 –