2017-01-03 1 views
0

2つのテーブルを選択し、1つのテーブルのフィールドをカウントして合計変数を作成するクエリを作成します。 例:は、変数が5より小さい2つのテーブルを結合したままにします。

Table A: 

ID | email 
1 | [email protected] 
2 | [email protected] 
3 | [email protected] 

表B

ID | email_id | username_id 
1 | 1  | 11 
2 | 1  | 22 
3 | 2  | 33 

マイクエリ:

select a.id, a.email, count(c.id) as total 
from tableA a 
left join tableC c on c.email_id = a.id AND total <= 5 
group by a.email LIMIT 1 

出力:私は最初に "a.id" を選択する必要が

Unknown column 'total' in 'on clause 

こと合計はです10 = 5.どうすればいいですか?

+0

:だけでなく、他の選択でクエリをラップすることですし、新しい列がWHERE上で利用できるようになります<5'ですが、もちろんwhere節でこれを行うことを意図していない限り、join結果全体で動作しますが、 'having 'を使用してグループ化したいとします。 – Charleh

+1

「LIMIT 1」とは何ですか?任意に1つの電子メールを選択して表示するには? –

+0

そして、tableA.emailに一意の制約があると思いますか? –

答えて

1

論理的にSelectWhere節の後に処理されるので、同じWhere節でエイリアス名を使用することはできません。

使用HAVING

select a.id, a.email, count(c.id) as total 
from tableA a 
left join tableC c on c.email_id = a.id 
group by a.email 
Having count(c.id) <= 5 
LIMIT 1 

私はMysqlはあなたにも

Having total <= 5 
+0

2秒で私にそれを打つ! +1 – e4c5

+0

これは完全にはわかりませんが、結果的にテーブルBのレコードを持たない電子メールを除外するのではなく、本質的に内部を結合することになります。 – Anand

+2

@Anand - No ..この場合、 'Count'は' 0'になり、 'count <= 5'をチェックします。 'Where'句と' Having'節でデータをフィルタリングするのは混乱します。 –

0

ただ、このAを作るためにカウント(c.id)< = 5

0

をHAVING試してみてくださいこれを行うことができますだと思います正しい回答が既に提供されているので、少し明確になります。HAVING句を使用する必要はありません。HAVING節がこの問題の解決策であるとは限りません。

句は、集計カラム(合計、カウント、最大、最小など)にフィルタを配置するために使用されますが、計算カラム(たとえばcolA + colB as calc_column)を使用した場合は、合計は、表現の別名で、あなただけの式自体を使用し `と(c.id)をカウントすることができ

SELECT * 
FROM (The query here) s 
WHERE s.total <= 5 
関連する問題