SQL - 有没有办法从选择中隐藏列?

时间:2016-12-28 16:33:22

标签: sql postgresql select join subquery

我做了一个查询,显示了我想要的结果(足够接近)......但它并不完美。

我计算每个用户的寄存器数量。

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"在此查询的结果中?

谢谢..

2 个答案:

答案 0 :(得分: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。或者,如果确实如此,那么您需要总计数。根据您的问题和样本数据,这似乎是合理的。

答案 1 :(得分: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;