2011-03-04 27 views
1

我有兩個簡單的表計數的記錄是一個而不是其他:MYSQL

用戶

+----+--------+-----------+ 
| id | gender | birthdate | 
+----+--------+-----------+ 

userpreference

+----+------------------+-----------------+ 
| id | preference value | preference type | 
+----+------------------+-----------------+ 

問題:

我想查詢所有未列出特定首選項值的人員,例如'shopping'。這包括所有未列出任何首選項類型的人員,以便該列可以爲空,但由於userpreference的列'id'引用了用戶作爲一個外鍵,我還希望在我的數量中包括所有沒有出現在第二個表中的用戶(用戶偏好)?

總不具備優先值「購物」作爲自己的喜好價值誰的人#:

這裏是我曾嘗試:

SELECT 
(
SELECT COUNT(DISTINCT userpreference.id) FROM userpreference 
WHERE preferencevalue != 'shopping') 
+ 
(
SELECT COUNT(users.id) 
FROM users 
WHERE users.id NOT IN 
(SELECT userpreference.Id 
FROM userpreference) 
) 
AS'Total' 

回答

2
Select Count(*) 
From Users 
Where Not Exists (
        Select 1 
        From UserPreference As UP1 
        Where UP1.id = Users.id 
         And UP1.PreferenceValue = 'Shopping' 
        ) 
+0

這是一個有趣的方法,從內括號開始,您首先將所有具有「購物」列出的人列爲自己的偏好值,然後從該結果中統計出用戶表中所有未顯示的人'身份證'作爲支票? – Warz 2011-03-04 02:39:23

+0

@Warz - 這是一個相關的子查詢,其中內部查詢引用外部查詢中的某些內容。如果每個用戶返回一個子查詢中的一行,則Exists表達式將返回true。 Exists子查詢返回一行的唯一方法是給定用戶至少有一個首選項,其中一個首選項行是「購物」。通過使用不存在,我說要麼沒有給定用戶的首選項行,要麼沒有「購物」行。 – Thomas 2011-03-04 03:58:04

0

嘗試右連接,這將包括所有不出現在第二個表中的人

SELECT * FROM Users RIGHT JOIN Userpr開啓(用戶。 userID =用戶。 userID) WHERE preference_value = '購物'

0

試試這個:

SELECT COUNT(DISTINT U.id)來自用戶的ü自然科學LEFT JOIN userpreference UP WHERE UP.preferencevalue爲空或UP.preferenceValue ='購物';

LEFT JOIN應該引入所有用戶的記錄是否有UP記錄。

+0

只有在有匹配時,左連接纔會在兩個記錄中給出記錄,我認爲你正在考慮正確加入 – 2011-03-04 02:13:55

+0

下面是我基於此文檔:LEFT JOIN關鍵字返回左表(table_name1)中的所有行,即使右表沒有匹配(table_name2)。 – 2011-03-04 03:01:11

相關問題