2016-12-28 260 views
0

我做了一個查詢,顯示我想要的結果(足夠接近)...但它不是完美的應該是。SQL - 有沒有一種方法可以隱藏select中的列?

我指望每個用戶寄存器的數量..

的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) | 
+-----------+-----------------+ 

但我真正想要的只是名稱和行數.. 我在子查詢中使用「rg.iduser」來引用這個INNER JOIN,但是因爲這樣,我在結果中得到了「iduser」。

有沒有更好的方法來做到這一點,以顯示我想要什麼..或者一種方法來隱藏在這個查詢結果中的「iduser」?

謝謝..

回答

3

Gordon的答案顯示了您執行查詢的更好方法。但是,我想解釋一下爲什麼在輸出看到兩列:

您正在使用在選擇列表中派生表_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 s。或者,如果是這樣,那麼你想要總數。根據你的問題和樣本數據,這似乎是合理的。

相關問題