2

次のクエリを実行しようとしています。質問の目的のために、クエリを可能な限り簡略化しました。基本的に私が書いているメールスケジュールアプリ用です。

2つのテーブル。電子メールは特定のスケジュールに属することができます。スケジュールは複数の電子メールで構成されます。送信された各電子メールには、特定のステップ番号が付けられています。step1、step2、step3、step4、step5

email_schedular (id, datecreated, recipient)
email(id, email_schedular_id, text, subject, sent, stepNumber)

今、私がやろうとしていることは、ステップが送信されたかどうかをレポートで判断することです。私はそれを試してみましたが、私がそれを正しい方法で行っているかどうかわかりませんか?

SELECT
  ed.id,
  ed.datecreated
  ed.recipient
  if(e.stepNumber= 1, 'Y', 'N')  AS step_1_sent,
  if(e.stepNumber= 2, 'Y', 'N')  AS step_2_sent,
  if(e.stepNumber= 3, 'Y', 'N')  AS step_3_sent,
  if(e.stepNumber= 4, 'Y', 'N')  AS step_4_sent
FROM 
  email_echedular ed
JOIN email e ON (e.email_echedular_id = ed.id)
GROUP BY ed.id
4

2 に答える 2

1

N送信されないforを使用する代わりに、を使用しNULLます。次に、それらをグループ化するときに、MAX()それぞれの値を取得して、NULLを1行まで削除できます。最終結果は、送信済みステップと未送信ステップed.idの1行ごとになります。YesNULL

SELECT
  ed.id,
  ed.datecreated
  ed.recipient
  MAX(if(e.stepNumber= 1, 'Y', NULL)) AS step_1_sent,
  MAX(if(e.stepNumber= 2, 'Y', NULL)) AS step_2_sent,
  MAX(if(e.stepNumber= 3, 'Y', NULL)) AS step_3_sent,
  MAX(if(e.stepNumber= 4, 'Y', NULL)) AS step_4_sent
FROM 
  email_schedular ed
  LEFT JOIN email e ON (e.email_schedular_id = ed.id)
GROUP BY ed.id

NULL未送信の列を本当に必要としない場合は、それらをラップして、を次COALESCE()のように置き換えることができます。NULLN

SELECT
  ed.id,
  ed.datecreated
  ed.recipient
  COALESCE(MAX(if(e.stepNumber= 1, 'Y', NULL)), 'N') AS step_1_sent,
  COALESCE(MAX(if(e.stepNumber= 2, 'Y', NULL)), 'N') AS step_2_sent,
  COALESCE(MAX(if(e.stepNumber= 3, 'Y', NULL)), 'N') AS step_3_sent,
  COALESCE(MAX(if(e.stepNumber= 4, 'Y', NULL)), 'N') AS step_4_sent
FROM 
  email_schedular ed
  LEFT JOIN email e ON (e.email_schedular_id = ed.id)
GROUP BY ed.id

編集変更されLEFT JOIN、結合条件が修正されました...

于 2012-07-10T18:28:05.010 に答える
0
SELECT
  ed.id,
  ed.datecreated
  ed.recipient
  if(e.stepNumber= 1, 'Y', 'N')  AS step_1_sent,
  if(e.stepNumber= 2, 'Y', 'N')  AS step_2_sent,
  if(e.stepNumber= 3, 'Y', 'N')  AS step_3_sent,
  if(e.stepNumber= 4, 'Y', 'N')  AS step_4_sent
FROM 
  email_echedular ed
JOIN email e ON (e.email_echedular = e.id)
GROUP BY ed.id

この行で誰JOIN email e ON (e.email_echedular = e.id)ですかe.email_Echedular?それをに変更しますJOIN email e ON (e.email_Schedular = e.id)

于 2012-07-10T18:37:42.667 に答える