2016-03-17 46 views
0

我的查询看起来像这样:限制LEFT JOIN结果为1,灵活的where子句

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子句的灵活性。任何解决方案

编辑

这样来说明情况。我们有一个包含用户(用户)的表格。我们有一个表格(mail_seder_jobs_actions)。我们还有其他与该查询无关的表格(表格1,表格2,表格3)

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

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

也可能某个操作与用户无关,因此该条目被忽略。

+0

这是否意味着您只是想要查询的第一个结果? – Aleeeeee

+0

不,它返回一堆用户。但是现在它会为同一用户返回重复项,因为user_id在mail_sender_jobs_actions表中多次出现... – jQuery

+0

因此,您希望每个用户有1行?如果是这样,你必须组 – Aleeeeee

回答

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})

但是,在具有计数(),因为它总是会返回1.如果你要计算每个用户有多少条记录已在mail_sender_jobs_actions表,那么你有小点使用左连接,分组,并将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 
+0

但这需要条目存在于mail_sender_jobs_actions中。 尽管mail_sender_jobs_actions中没有此用户的输入,但我仍然希望返回结果事件。 编辑:删除mail_sender_jobs_actions where子句,因为它们对此查询保持灵活性。 – jQuery

+0

查看我更新的答案。下次请让问题更清楚。 – Shadow

+1

@Shadow如果您不清楚OP究竟在问什么,最好不要回答问题,最好是向OP要求澄清。 – GordonM