3

メンバーごとにすべてのトランザクションを追跡する、orders というテーブルがあります。このテーブルは、registrationstatusid へのすべての変更を追跡します。registrationstatusid を 7 から 5 に変更したメンバーを見つける必要があります。しかし、クエリの書き方がわかりません。これが私が試したことです:

select memberevents.memberid, orders.registrationstatusid
FROM orders
INNER JOIN memberevents ON orders.membereventid = memberevents.id
WHERE
memberevents.eventid = 2 AND
memberevents.deletedAt IS NULL AND
orders.registrationstatusid IN (5,7)
ORDER BY m.memberid, o.updatedAt

そのクエリは 5 と 7 を持つすべてのレコードを表示しますが、必要なのは 5 と 7 を持つメンバーだけです。AND (orders.registrationstatusid = 5 AND orders.registrationstatusid = 7) を実行しようとすると、レコードが見つかりません。誰でも私を助けてもらえますか?

4

1 に答える 1

1

これは、「set-within-sets」クエリの例です。これは、集計とロジックをhaving句に入れることで解決できます。

select memberevents.memberid
FROM orders INNER JOIN
     memberevents
     ON orders.membereventid = memberevents.id
WHERE memberevents.eventid = 2 AND
      memberevents.deletedAt IS NULL
group by memberevents.memberid
having sum(orders.registrationstatusid = 5) > 0 and
       sum(orders.registrationstatusid = 7) > 0;

唯一の注意点: これは、「5」と「7」の両方の値を持つメンバーを示しています。ただし、値の順序は指定しません。

編集:

この文字列操作トリックを使用して順序を見つけることができます。

select memberevents.memberid,
       group_concat(orders.registrationstatusid) as statuses
FROM orders INNER JOIN
     memberevents
     ON orders.membereventid = memberevents.id
WHERE memberevents.eventid = 2 AND
      memberevents.deletedAt IS NULL
group by memberevents.memberid
having concat(',', statuses, ',') like '%,7,5,%';

次のhaving句も機能することを認識しています。

having find_in_set(5, statuses) = find_in_set(7, statuses) + 1 and
       find_in_set(7, statuses) > 0;
于 2013-08-12T18:58:32.147 に答える