簡體   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