2

好的,这是我的 SQL,我使用的是 MySQL:

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;

问题是用户和位置列不是来自与该资产的 max(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的 max(time) 对应的值。

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

我的想法是我需要做一个子选择,但我不确定最好的方法。

4

1 回答 1

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))
于 2012-07-31T18:03:18.760 回答