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

时间:2016-03-17 16:12:02

标签: php mysql left-join

我的查询看起来像这样:

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子句是灵活的,这意味着某些人可能只想向用户显示特定的操作。

操作也可能与用户无关,因此会忽略此条目。

1 个答案:

答案 0 :(得分:0)

  1. 根据您所拥有的条件,使用左连接没有意义,因为where条件适用于右侧的表格,有效地将左连接转换为内连接。

  2. 显然你不使用右侧表中的任何列,所以我不使用联接,而是使用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})

  3. 然而,拥有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