1

私は2つのテーブルを持っています:

Members:

id     username    


Trips:

id    member_id     flag_status         created
                  ("YES" or "NO")

次のようなクエリを実行できます。

SELECT 
  Trip.id, Trip.member_id, Trip.flag_status
FROM  
  trips Trip
WHERE   
  Trip.member_id = 1711
ORDER BY
  Trip.created DESC
LIMIT
  3

次のような結果が得られる可能性があります。

id       member_id     flag_status
8        1711          YES
9        1711          YES
10       1711          YES

私の目標は、メンバーの最後の 3 回の旅行がすべて flag_status = "YES" であるかどうかを知ることです。

また、WHERE Trip.member_id = 1711 句を削除して、すべてのメンバーに対して実行し、最後の 3 回の旅行のすべてが flag_status = "YES" であるメンバーの総数を取得できるようにしたいと考えています。

何か案は?

ありがとう!

http://sqlfiddle.com/#!2/28b2d

その sqlfiddle で、探している正しいクエリが実行されると、次のような結果が表示されるはずです。

 COUNT(Member.id)
        2

資格のある 2 人のメンバーは、メンバー 1 と 3 です。メンバー 5 は、出張の 1 つが flag_status = "NO" であるため、失敗します。

4

2 に答える 2

2

fthiella のソリューションの単純さは気に入っていますが、データ表現に大きく依存するソリューションは考えられません。それに依存しないために、次のようなことができます:

SELECT COUNT(*) FROM (
  SELECT member_id FROM (
    SELECT
      flag_status,
      @flag_index := IF(member_id = @member, @flag_index + 1, 1) flag_index,
      @member := member_id member_id
    FROM trips, (SELECT @member := 0, @flag_index := 1) init
    ORDER BY member_id, id DESC
  ) x
  WHERE flag_index <= 3
  GROUP BY member_id
  HAVING SUM(flag_status = 'NO') = 0
) x

ここでフィドル。ユーザーの 1 人を削除するために、フィドルを少し変更したことに注意してください。

このプロセスでは、基本的に各メンバーの旅行がランク付けされid desc、最後の 3 つだけが保持されます。次に、取得した旅行のいずれにもNOflag_status が含まれていないことを確認します。最後に、一致するすべてのメンバーがカウントされます。

于 2013-11-09T17:09:00.507 に答える