2012-07-31 32 views
2

OK選擇列,這是我的SQL,和我使用MySQL:在同一行MAX(列)

SELECT 
    assets.id, 
    IF(max(asset_checkins.time) IS NULL AND max(asset_checkouts.time) IS NOT NULL, 'checked-out', 
    IF(max(asset_checkouts.time) > max(asset_checkins.time), 'checked-out', 
    'checked-in') 
) 'status', 
    asset_checkouts.user, asset_checkouts.location 
FROM 
    assets 
    left outer join asset_checkouts on asset_checkouts.asset = assets.id 
    left outer join asset_checkins on asset_checkins.asset = assets.id 
group by assets.id; 

的問題是,用戶和位置列不從該行對應的未來到該資產的最大值(psdl_asset_checkouts.time)。

相反,我得到:

id status   user location 
15 checked-out  1  4<-this 
16 checked-out  1  4 

當我想:

id status   user location 
15 checked-out  1  7<-this 
16 checked-out  1  4 

這裏是asset_checkouts表,我想的值是 「7」;對應於資產15的最大(時間)的值。

id  user asset time   location 
3  1  15  7/30/12 12:29 4 
14  1  15  7/31/12 11:01 7 

我的想法是,我將需要做一個子選擇,但我不知道這樣做的最佳方式。

+0

你可以發佈你的表模式,一些示例數據,你期望的結果集是什麼? – 2012-07-31 16:36:08

+0

我重新格式化了表模式和結果集,以使它們更易於閱讀。 – Brandon 2012-07-31 16:46:55

+0

首先,您應該避免選擇不在「GROUP BY」子句中的裸列;應始終使用[聚合函數](http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html)處理它們。否則,MySQL只會給你一個組中的該列的隨機值!其次,您的問題似乎是[獲得每組最多N行](http://stackoverflow.com/questions/tagged/greatest-n-per-group)問題的變體。看看那些相關的問題。 – 2012-07-31 18:43:41

回答

1

它不漂亮,但它的工作原理。它將返回資產的最新狀態以及用戶和檢出或檢入的位置。如果檢入和檢出位於同一個表中,這可能會更好一些。

SELECT id,`status`,user,location FROM 
    (
    SELECT a.id, 'checked-out' `status`,co.`time`, co.user, co.location 
    FROM assets a left join asset_checkouts co on a.id=co.asset 

    UNION ALL 

    SELECT a.id, 'checked-in' `status`, ci.`time`, ci.user, ci.location 
    FROM assets a left join asset_checkins ci on a.id=ci.asset 
    WHERE NOT ci.`time` IS NULL 
    ) U 

WHERE `time` = GREATEST((SELECT COALESCE(MAX(`time`),0) 
         FROM asset_checkouts co 
         WHERE co.asset=U.id), 
         (SELECT COALESCE(MAX(`time`),0) 
         FROM asset_checkins ci 
         WHERE ci.asset=U.id)) 
+0

這工作,謝謝。雖然我認爲我會考慮將簽到和結賬移到同一張表。 – Brandon 2012-07-31 19:50:15