2016-12-28 89 views
0

私は望む結果(十分に近い)を示すクエリを作成しましたが、完璧ではないはずです。私は、ユーザーごとのレジスタの数を数えていますSQL - 選択から列を非表示にする方法はありますか?

..

SQL:

SELECT us.name, _reg FROM tb_user AS us 
LEFT JOIN tb_register as rg ON rg.iduser = us.iduser 
INNER JOIN 
    (select rg.iduser, count(*) 
     FROM tb_register AS rg  
     group by rg.iduser) 
AS _reg ON rg.iduser = _reg.iduser 

GROUP BY us.name, _reg 

私が得る結果は...のようなものである

+-----------+-----------------+ 
| name  | _reg   | 
+-----------+-----------------+ 
| example_A | (id_A, count_A) | 
+-----------+-----------------+ 
| example_B | (id_B, count_B) | 
+-----------+-----------------+ 

しかし、私は、本当に欲しいのはちょうど名前と行数です。 私はこのINNER JOINで参照するためにサブクエリ "rg.iduser"で使用していますが、そのために結果に "iduser"が表示されます。

このクエリの結果に「iduser」を隠す方法や、私が望むものを表示するためのより良い方法はありますか?

おかげ..

答えて

3

ゴードンの答えは、あなたにクエリを実行するより良い方法を示しています。

あなたはその派生テーブルなどからのすべての行を取得していることを選択し、リスト内の派生テーブル_regの別名を使用している。しかし、私はは、なぜあなたは、出力の両方の列を見ている説明したいと思います匿名のレコード。あなただけのカウントをしたい場合は、その列に適切なエイリアスを与え、外側の選択でを参照し、ない:

また、外側の選択でgroup byは役に立たないようだ:

SELECT us.name, _reg.cnt --<< HERE 
FROM tb_user AS us 
    LEFT JOIN tb_register as rg ON rg.iduser = us.iduser 
    JOIN (
    select rg.iduser, count(*) as cnt --<< HERE 
    FROM tb_register AS rg  
    group by rg.iduser 
) AS _reg ON rg.iduser = _reg.iduser; 
4

はちょうどあなたがしたい列を選択します。クエリは、しかし、より簡単と書かれている:あなたは結果セットで欲しいものを考える

SELECT us.name, COUNT(rg.iduser) 
FROM tb_user us LEFT JOIN 
    tb_register rg 
    ON rg.iduser = us.iduser 
GROUP BY us.name; 

、サブクエリのための必要はありません。

注:特定の名前が一意であり、複数の範囲にまたがっていないと仮定しています。iduserまたは、そうであれば、合計カウントが必要です。あなたの質問とサンプルのデータに基づいて、これは妥当と思われます。

関連する問題