2011-03-04 12 views
1

私は2つの単純なテーブルカウントレコード他の一つではありません:MYSQL

ユーザー

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

userpreference

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

を持って質問:

私は、 '買い物'のような特定の嗜好値をリストしていないすべての人に問い合わせたいと思っています。これは、嗜好タイプを列挙していないので、外来キーとして、2番目のテーブル(ユーザーの好み)に表示されないすべての人を自分の人数に含めたいと思っていますか?自分の好み値として優先値「ショッピング」を持っていない人の

合計#:

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

これは面白いアプローチです。内括弧は、最初に「買い物」を好みの値に設定して、その結果から数えます。チェックとして「id」? – Warz

+0

@Warz - これは内部クエリが外部クエリで何かを参照する相関サブクエリです。 Exists式は、サブクエリ内の1つのローが各ユーザに対して返される場合にtrueを返すように動作します。 Existsサブクエリが行を返す唯一の方法は、特定のユーザーに少なくとも1つの設定があり、その設定行の1つが「買い物」である場合です。 Not Existsを使用することで、指定したユーザーの優先行がないか、「ショッピング」の行がないと言います。 – Thomas

0

のJOIN RIGHT、その意志を試してみてください。

ここでは、私が試したものです

SELECT * FROM Users 右ジョイントUserpr (ユーザ。 userID =ユーザー。 preference_value = 'ショッピング'

0

はこのお試しくださいuserID) :!UP.preferencevalueはNULL OR UP.preferenceValue IS WHERE UP userpreferenceを登録しよユーザU NATURAL左から

SELECT COUNT(DISTINT U.idを)= 'ショッピング';

LEFT JOINはUPレコードがあるかどうかにかかわらず、すべてのユーザーレコードをインポートする必要があります。

+0

left joinはonに一致があるときのみ両方のレコードを与えます、私はあなたが正しいjoinを考えていると思います。 –

+0

これは私がそれを基にしていた文書です:LEFT JOINキーワードは左のテーブル(table_name1)右側のテーブル(table_name2)に一致するものがなくても –

関連する問題