2

OK、これが私の 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 に答える