1

次のテーブルがあります。

members:
----------------------------------------------
| member_id | member_name | member_join_date |
----------------------------------------------  

events:
-------------------------
| event_id | event_name |
-------------------------

event_dates:
--------------------------------------
| event_id | event_date | event_week |
--------------------------------------

attendance:
------------------------------------------------------------
| member_id | event_id | attendance_date | attendance_week |
------------------------------------------------------------

そのため、特定の時間に組織に参加したメンバーがいて、毎週のイベントに参加する場合があります (イベントの発生はevent_datesテーブルによって監視されます) 。

私がやりたいことは、少なくとも3回連続して欠席しているすべてのメンバーを取得することです

できる限りのことをしましたが、クエリの各部分はあると思いますが、それらをマージする方法がわかりません。

彼らが参加できた可能性のあるすべてのイベントを取得します。

    SELECT
      m.member_id AS id,
      ed.event_id,
      ed.event_week
    FROM
      members AS m
      LEFT JOIN
        event_dates AS ed
        ON
          ed.event_date >= m.member_join_date

彼らが実際に参加したすべてのイベントを取得します。

    SELECT
      m.member_id AS id,
      a.event_id
    FROM
      members AS m
      LEFT JOIN
        attendance AS a
        ON
          a.member_id = m.member_id

2 つのクエリを 1 つにマージできれば、おそらくこの質問に対する答えは次のようになります。

連続する非 null 値の数

しかし、今回はNULL値をカウントしたい

4

1 に答える 1

0

以下を試すことができます:

select * from (select m.*,k.*, 
@rn := CASE WHEN bevent_id is null THEN @rn+1 ELSE 0 END AS rn
        from(
SELECT
      m.member_id AS id,
      ed.event_id  ,event_date  
    FROM
      members AS m
       left JOIN
        event_dates AS ed
        ON
          ed.event_date >= m.member_join_date) m
left join (SELECT
      m.member_id AS bid,
      a.event_id as bevent_id
    FROM
      members AS m
      LEFT JOIN
        attendance AS a
        ON
          a.member_id = m.member_id) k  on m.id=k.bid 
and m.event_id=k.bevent_id , (SELECT  @rn := 0) AS vars
order by m.id,m.event_date ) main
where rn>=3

あなたが提供した2つのクエリを使用して、2つのクエリの結果を比較するために左結合を行います。メンバーが 3 回連続して欠席したかどうかを追跡するために、@rn を使用して追跡します。

ここで SQL フィドル。

于 2012-09-25T08:52:11.233 に答える