1

クエリで結合する必要がある 3 つのテーブル (スケジュール、登録済み、待機リスト) を持つ MySql データベースがあります。彼らは基本的なクラスの登録システムを実装しています。

スケジュールには、スケジュールされたクラスが含まれます。ユーザーがクラスに登録すると、ユーザー アカウント ID とスケジュールされたクラスの ID が登録済みに格納されます。クラスが定員に達している場合は、代わりにウェイティング リストに格納されます。3 つのテーブルはすべて、各クラスを識別する scheduleId 列を共有します。

スケジュール テーブルにクエリを実行するときは、登録済みで特定の scheduleId を待機しているユーザーの数を表す、登録済みおよび待機リストの列も返す必要があります。

これを達成するために私が思いついた予備的なクエリは次のとおりです。

select s.id, s.classDate, s.instructor, COUNT(e.id) as enrolled
from schedule as s
left outer join enrolled as e
on s.id = e.scheduleId
group by s.id

どちらでも問題なく機能しますが、明らかに、登録済みテーブルと待機リスト テーブルの両方の値をこの方法で取得することはできません。誰かがこれを行う良い方法を提案できますか?

4

3 に答える 3

4

ネストされた SELECT クエリを使用します。スキーマについて少し仮定すると、次のようなものはどうでしょうか (SQL の一部のフレーバーでは機能しない可能性があります)。

select s.id, s.classDate, s.instructor, 
       (select COUNT(e.id) from enrolled e where e.scheduleId = s.id) as enrolled,
       (select COUNT(w.id) from waitlist w where w.scheduleId = s.id) as waiting
from schedule as s
group by s.id
于 2009-01-22T03:16:55.023 に答える
3

別の左結合と2つのインラインカウント(個別)でそれを行います

select s.id, s.classDate, s.instructor ,
count(distinct e.id) as enrolled,
count(distinct w.id) as waiting
from schedule as s
left outer join enrolled as e
on s.id = e.scheduleID
left outer join waitlist as w
on s.id = w.scheduleID
group by s.id

サブクエリに対してこのアプローチを実行すると、約 2 倍の速さで実行されましたが、かなり小さな結果セットを見ています。

于 2009-01-22T04:56:04.777 に答える
0

2 つの簡単な方法:

1-COUNT(DISTINCT e.id), COUNT(DISTINCT w.id)各テーブルの一意のインスタンスの数を取得するために使用し、両方を結合します。これはおそらく恐ろしく非効率的です。

2- 句でサブクエリを使用FROMします (MySQL 5.0 以降でのみ機能します)。

SELECT s.id, s.classDate, s.instructor, tmpE.c AS enrolled, tmpW.c AS waiting
FROM
  schedule AS s,
  ( SELECT scheduleID, COUNT(*) AS c FROM enrolled GROUP BY scheduleID ) AS tmpE,
  ( SELECT scheduleID, COUNT(*) AS c FROM waiting GROUP BY scheduleID ) AS tmpW
WHERE
    s.id = e.scheduleID
    AND s.id = w.scheduleID
GROUP BY s.id

しかし、私はそこで左結合を逃したかもしれません。

于 2009-01-22T03:10:53.117 に答える