2011-09-13 49 views
2

我在获取此SQL时遇到了一些问题。 iPad和statlog表之间有一对多的关系,我想选择具有最高价值的statlog。在加入中使用MAX函数

我的第一个解决方案是包含一个嵌套的SELECT,它为我取得了最大值,但是由于这需要一个批次我不得不重写它。

SELECT 
    ipad.udid, 
    ipad.state, 
    statelog.new_state 
FROM 
    ipad 
LEFT OUTER JOIN 
    statelog 
ON 
    ipad.udid = statelog.udid 
WHERE 
    ipad.airid=250033 
    AND 
    statelog.new_state = MAX(statelog.new_state) 

该SQL不起作用,但它显示了我的意图。

+0

你的查询如何不起作用,它会抛出一个错误? – Shef

+0

MAX(statelog.new_state)将获得最大值,而不是他需要的特定id的最大值 –

+0

使用嵌套选择通常是这样做的方法,尽管由于只有'statelog'是'new_state',SWeko的答案应该适合你。 –

回答

6

像这样将工作

SELECT ipad.udid, ipad.state, max(statelog.new_state) 
FROM ipad 
    LEFT OUTER JOIN statelog ON ipad.udid = statelog.udid 
WHERE ipad.airid=250033 
GROUP BY ipad.udid, ipad.state 

MAX和其它集合函数在SQL(分钟,求和,计数,平均,等等。)的值的组工作。 连接为每个ipad生成一个statelog,所以如果你有10个ipad,每个ipad有8个statelog,你会得到80行。 Group by为每个ipad组分配80行(它们的ipad.udid和ipad.state列是相同的),并且在该组的范围内使用max(statelog.new_state)来提取最大状态。

+1

因为OP不需要statelog中的其他东西,所以这个答案是正确的! – Bohemian

+0

谢谢。这将我的查询时间从50秒改为0.3秒。 – Burbas