group by有元素

时间:2012-07-10 18:23:20

标签: mysql if-statement group-by

我尝试使用以下内容进行查询。为了问题的目的,我尽可能地简化了查询。它基本上是我写的电子邮件计划应用程序。

两张桌子。电子邮件可以属于特定的计划。计划包括几封电子邮件。已发送的每封电子邮件都标有特定的步骤编号。 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

2 个答案:

答案 0 :(得分:1)

不使用N未发送,而是使用NULL。然后,当您对它们进行分组时,可以为每个值取MAX()值,并将NULL消除为一行。最终结果应为每ed.id行一行,发送步骤为Yes,未发送步骤为NULL

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()中以将NULL替换为N

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并修复了加入条件...

答案 1 :(得分: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)