繁体   English   中英

使用灵活的where子句将LEFT JOIN结果限制为1

[英]Limit LEFT JOIN results to 1 with flexible where clause

我的查询如下所示:

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表可以(不需要返回任何内容)返回多个条目。 我不想对结果进行分组,但仍将mail_sender_jobs_actions的返回限制为1,因此我不会得到重复...否则计数将无法正常工作。

我想保持where子句的灵活性,因此报废了整个Web,却发现没有任何工作对我有用。 有什么办法吗?

编辑

所以解释一下情况。 我们有一个包含用户(用户)的表。 我们有一个包含动作的表(mail_seder_jobs_actions)。 我们还有与此查询不相关的其他表(table1,table2,table3)

如果用户执行操作,则将在操作表中创建一个条目。

where子句很灵活,这意味着有人可能只想向用户显示特定的操作。

动作也可能与用户无关,因此该条目将被忽略。

  1. 使用where准则时,使用左联接毫无意义,因为where准则适用于右侧表,因此可以将左联接有效地转换为内部联接。

  2. 显然,您不使用右侧表中的任何列,因此,我将使用一个exist存在子查询代替使用联接。

    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表中拥有的记录数,则必须使用左连接,分组并在其中移动加入条件的标准:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM