2016-03-17 48 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