2015-05-25 52 views
-4

我有3個表格。用戶,警報和前綴。用戶顯然是我的用戶信息表。 Alert是我存儲用戶警報/通知設置的表格,pref是我存儲用戶偏好的地方。MYSQL,如果存在

並非所有的用戶都會擁有首選項和警報條目。當我嘗試撥打警報時,我遇到了SQL知識問題。

我正試圖做一個3方式加入用戶,警報和pref在uid是相同的。我想選擇所有user.id而忽略了一個alert.deleted和pref.deleted所有的uid =做1

user | alert | pref 
id   uid   uid 
      alert_id  pref_id 
      deleted  deleted 
+3

這是模式,這是偉大的,但你試圖*執行連接的查詢在哪裏? – tadman

+0

您是否嘗試在連接條件中使用已刪除字段的左外連接? – daxur

回答

2

一種方法是

SELECT id 
FROM user 
WHERE user.id not in (SELECT uid FROM alert WHERE deleted = 1) 
AND user.id not in (SELECT uid FROM pref WHERE deleted = 1); 

但如果你的意思是說你想,其實有一個警報和PREF,只是沒有被刪除的那些所有的用戶,可以使用

SELECT  id 
FROM  user 
INNER JOIN pref 
ON   user.id = pref.uid 
AND  pref.deleted = 0 
INNER JOIN alert 
ON   user.id = alert.uid 
AND  alert.deleted = 0; 

在你的問題,你是在談論得到警報,所以也許沒有任何偏好設定一定爲特定的我們呃,但你希望所有的尚未刪除的警報,然後使用

SELECT   id 
FROM   user 
LEFT OUTER JOIN pref 
ON    user.id = pref.uid 
AND    pref.deleted = 0 
INNER JOIN  alert 
ON    user.id = alert.uid 
AND    alert.deleted = 0; 

隨你挑。

+0

請使SQL關鍵字CAPS,其慣例。 –

+0

你不覺得INNER JOIN更好嗎? –

+0

@ jQuery.PHP.Magento.com - 不可以。這可能是因爲alert或pref中的特定用戶沒有任何記錄。他想要返回所有用戶,除了那些已經刪除警報或前綴的用戶。那,或者他沒有正確地問他的問題。 – avk

1
SELECT id 
FROM user u 
WHERE NOT EXISTS (SELECT 1 FROM alert WHERE uid = u.id AND deleted = 1) 
    AND NOT EXISTS (SELECT 1 FROM pref WHERE uid = u.id AND deleted = 1) 
;