0

と呼ばれるテーブルがactivitiesありdeficienciesます。

activitiesテーブルには、学生が登録したすべての活動が含まれています。deficiencies表には、登録された活動のために学生が得る可能性のあるすべての欠陥が含まれています。

サンプル データを含むテーブル構造は次のとおりです。

活動表

activityid  title
-------------------------------------------------------------
1           Student Retreat
2           Student Orientation

欠陥表

deficiencyid    activity_id     deficiency      status
-------------------------------------------------------------
1               1               NARRATION       CLEARED
2               1               PHOTO           CLEARED
3               1               REPORT          CLEARED
4               2               NARRATION       WAITING
5               2               PHOTO           CLEARED
6               2               REPORT          WAITING

アクティビティ エントリごとに、deficienciesテーブルに 3 つの行が表示されます。そこにリストされているアイテムのすべてのステータスがすでにCLEARED. そのため、1 つ以上がまだ残っている場合WAITING、それらはクエリにリストされません。

このクエリを使用してこれを実行しようとしましたが、うまくいきませんでした:

SELECT * FROM deficiencies,activities WHERE status='CLEARED' AND activityid=activity_id AND COUNT(deficiencyid)=3 GROUP BY activity_id ORDER BY deficiencyid ASC

私はMySQLから以下を取得していました:

Invalid use of group function

私が期待していた出力は、activitiesテーブルの最初のレコードです。

別のサブクエリで複数SELECTのクエリを使用せずに、1 つのクエリのみを使用する最適なソリューションは何でしょうか? テーブルには何千ものレコードがあるため、最も効率的なクエリを使用できることを願っています。SELECTSELECT

4

1 に答える 1

1

JOIN でこれを行う場合:

 SELECT A.activityid, A.title FROM activities A INNER JOIN deficiencies D 
    ON A.activityid = D.activityid WHERE D.status = 'CLEARED'
    GROUP BY A.activityID, A.title HAVING COUNT(*) = 3

これは、アクティビティ テーブルと欠陥テーブルを結合し、CLEARED 以外のレコードを除外し、アクティビティ別にグループ化し、正確に 3 つのレコードを含まないグループを除外します。

データが記述どおりであることが保証されている必要があります (常に 3 つの欠落レコード)。GROUP BY を記述して、MySQL 拡張機能を使用しないようにし、グループ化されていない、集計されていない列を選択できるようにしました。また、明確にするために省略した Studentid フィールドも含まれていると思います。そうしないと、このシステム全体で 1 人の学生しかサポートされなくなります。

于 2012-09-29T19:00:37.850 に答える