1

名前の付いた3つのテーブルがあります

  1. com_event_schedules
  2. com_予定
  3. com_event_schedules_com_appointment_c

最初の 2 つのテーブル間に関係があります。

以下はテーブルのフィールドです

  1. com_event_schedules -- id -- 名前 -- スケジュール日 -- 開始時刻 -- 終了時刻 -- 削除
  2. com_appointments -- id -- start_time -- end_time -- ステータス
  3. com_event_schedules_com_appointment_c -- id -- com_event_schedules_com_appointmentcom_event_schedules_ida (スケジュール ID) -- com_event_schedules_com_appointmentcom_appointment_idb (予定 ID)

テーブル com_event_schedule と com_appointments の関係は 1 対多です

結果のschedule_idに必要なもの、およびstatus = 'completed'の予定の合計数

次のクエリを試しました:

SELECT sch.id,COUNT(app.status) 
FROM 
com_event_schedules sch, 
com_appointment app, 
com_event_schedules_com_appointment_c rel 
WHERE 
sch.id=com_event_schedules_com_appointmentcom_event_schedules_ida AND 
app.id=rel.com_event_schedules_com_appointmentcom_appointment_idb AND
app.status='completed'

私が結果として期待しているのは、ステータスが「完了」である予定の COUNT を含む各スケジュールの ID であり、一致がない場合は COUNT が「0」である必要があります。

しかし、結果として得られるのは、ステータスが完了し、COUNT 1 の予定を持っているスケジュール ID のみです。

例えば

2 つのスケジュールがあり、それぞれに 3 つの予定があります。そのうち、最初のスケジュールの 1 つの予定が status='completed' になっています

だから私はこのような結果が必要です

sch_id     app.status
1              1
2              0
4

2 に答える 2

0

1) 特定の状況では同じ結果が得られますが、FROM 複数のテーブルを無差別に選択するのではなく、JOINS を使用する必要があります。使用する JOIN のタイプは、所有しているデータとそのデータで何をしたいかによって異なります。以下の例では、LEFT JOINS を使用しています。

詳細については、次を参照してください: FROM 行の SQL 左結合と複数のテーブル?

2) 次に、「Where app.status='completed'」を含めることで、完了していない予定に関する情報を取得する可能性を排除しています (正のカウントのみを返す)。これが、ここで LEFT JOIN を使用する理由です。結合条件 "status=completed" に一致するものがない場合でも、右側に NULL が返されます。

わかりやすい視覚的な説明については、http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlを参照してください。

3) Count は集計関数であるため、1 つの結果のみが返されます。ただし、列ごとにグループ化してその列ごとに結果を返す場合を除きます。この場合、スケジュールごとに完了した予定の数を返す必要があるため、ID (sch.id) でグループ化します。

SELECT 
  sch.id,COUNT(app.status)
FROM
  com_event_schedules sch
LEFT JOIN 
  com_event_schedules_com_appointment_c  rel 
  ON 
  sch.id=rel.com_event_schedules_com_appointmentcom_event_schedules_ida
LEFT JOIN
  com_appointments app 
  ON 
  app.id=rel.com_event_schedules_com_appointmentcom_event_schedules_idb=app.id
  AND 
  app.status='completed'
GROUP BY 
  id

結合や集計に詳しくなく、その仕組みを知りたい場合は、上記のクエリの GROUP BY と COUNT の部分を削除して、集計されていない結果セットを確認します。物事が少し明確になるはずです。

SELECT 
  sch.id,app.status
FROM
  com_event_schedules sch
LEFT JOIN 
  com_event_schedules_com_appointment_c  rel 
  ON 
  sch.id=rel.com_event_schedules_com_appointmentcom_event_schedules_ida
LEFT JOIN
  com_appointments app 
  ON 
  app.id=rel.com_event_schedules_com_appointmentcom_event_schedules_idb=app.id
  AND 
  app.status='completed'
于 2013-06-07T07:57:32.330 に答える