2016-12-28 256 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。或者,如果是这样,那么你想要总数。根据你的问题和样本数据,这似乎是合理的。

相关问题