我尝试使用以下内容进行查询。为了问题的目的,我尽可能地简化了查询。它基本上是我写的电子邮件计划应用程序。
两张桌子。电子邮件可以属于特定的计划。计划包括几封电子邮件。已发送的每封电子邮件都标有特定的步骤编号。 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
答案 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)