我的查询看起来像这样:
SELECT
count(users.id)
FROM users
LEFT JOIN mail_sender_jobs_actions ON mail_sender_jobs_actions.userID = users.id
LEFT JOIN table2 ON table2.userID = users.id
LEFT JOIN table3 ON table3.userID = users.id
WHERE {$flexibleWhereClause}
现在,mail_sender_jobs_actions表CAN(不需要返回任何内容)返回多个条目。我不想对结果进行分组,但仍然将mail_sender_jobs_actions的返回值限制为1,因此我不会重复...否则计数将无法正常工作。
刮掉整个网络,发现没有什么对我有用,因为我想保持where子句的灵活性。任何解决方案?
修改
所以解释一下情况。我们有一个用户(用户)的表。我们有一个带有动作的表(mail_seder_jobs_actions)。我们有与该查询相关的其他表格不相关(table1,table2,table3)
如果用户执行操作,则会在操作表中创建一个条目。
where子句是灵活的,这意味着某些人可能只想向用户显示特定的操作。
操作也可能与用户无关,因此会忽略此条目。
答案 0 :(得分:0)
根据您所拥有的条件,使用左连接没有意义,因为where条件适用于右侧的表格,有效地将左连接转换为内连接。
显然你不使用右侧表中的任何列,所以我不使用联接,而是使用exists subquery。
SELECT
1 as count,
users.email
FROM users
WHERE EXISTS (SELECT 1
FROM mail_sender_jobs_actions
WHERE mail_sender_jobs_actions.userID = users.id
AND mail_sender_jobs_actions.type = '1'
AND mail_sender_jobs_actions.jobID = '106'
AND {$flexibleWhereClause})
然而,拥有count()是没有意义的,因为它总是返回1.如果你想计算每个用户在mail_sender_jobs_actions
表中有多少条记录,那么你必须使用左连接, group by,并将where标准移动到连接条件中:
SELECT
count(mail_sender_jobs_actions.userID),
users.email
FROM users
LEFT JOIN mail_sender_jobs_actions ON mail_sender_jobs_actions.userID = users.id
AND mail_sender_jobs_actions.type = '1'
AND mail_sender_jobs_actions.jobID = '106'
AND {$flexibleWhereClause}
GROUP BY users.email