1

クラブの会員情報を含むデータベースがあります。各メンバーは、いつでも3つの異なるステータス(アクティブ、ベテラン、アソシエート)のいずれかになります。私はそれを3つのテーブルに分けています。すべてのメンバー情報を含むメンバーテーブル、status_nameとstatus_idを含むステータステーブル、およびmember_id、status_id、date_from、date_toを含むグリッドテーブル。

メンバーが各ステータスで費やした時間を計算しようとしています。私は現在、次のクエリを使用して、メンバーが「アクティブ」ステータスで費やした合計時間を計算しています。

SELECT first_name, last_name, 
 (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as service_years 
 FROM member a
 LEFT JOIN member_status q on a.id = q.member_id AND q.status_id = 1
 GROUP BY a.id

左側の結合のANDを省略することで、その人がメンバーであった合計時間を取得できることはわかっていますが、1回のクエリで各ステータスの時間を計算する方法がわかりません。

私の理想的な結果は、次のようなものです。

 -----------------------------------------------------------
 |member_name | active_years | veteran_years | total_years |
 -----------------------------------------------------------
 |name        | 5            | 5             | 10          |
 -----------------------------------------------------------

単一のクエリで私が探していることを達成する方法はありますか?

4

2 に答える 2

0

1 = アクティブで 2 = ベテランであると仮定すると、次のように動作するはずです。

SELECT first_name, last_name, 
 (DATE_FORMAT( FROM_DAYS( SUM( case when q.status_id = 1 then DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) else 0 end ) , "%Y" ) +0) as active_years,
 (DATE_FORMAT( FROM_DAYS( SUM( case when q.status_id = 2 then DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) else 0 end ) , "%Y" ) +0) as veteran_years,
(DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as total_years 
 FROM member a
  LEFT JOIN member_status q on a.id = q.member_id AND q.status_id in (1,2)
 GROUP BY a.id

もう 1 つのオプションは、member_status テーブルを複数回結合することです。

于 2012-10-03T14:05:14.253 に答える
0

CASEステートメントを使用してステータス名を決定し、ステータスに基づいて合計年数を計算する、次のようなことができるはずです。

SELECT first_name, 
  last_name, 
  CASE WHEN status_name = 'active' 
    then (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) end as active_years,
  CASE WHEN status_name = 'veteran' 
    then (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) end as active_years,
  (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as total_years,
FROM member a
LEFT JOIN member_status q 
  on a.id = q.member_id 
  AND q.status_id = 1
GROUP BY a.id, a.first_name, a.last_name

サンプルデータを投稿すると、適切なクエリを簡単に判断できます

于 2012-10-03T14:02:40.927 に答える