【问题标题】:SQL - Is there a way to hide a column from a select?SQL - 有没有办法从选择中隐藏一列?
【发布时间】:2016-12-28 16:33:22
【问题描述】:

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

我正在计算每个用户的注册数量..

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”?

谢谢..

【问题讨论】:

    标签: sql postgresql select join subquery


    【解决方案1】:

    只需选择您想要的列。不过,查询更简单地写成:

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

    根据您想要的结果集中的内容,不需要子查询。

    注意:我假设给定名称是唯一的,并且不跨越多个idusers。或者,如果确实如此,那么您需要总计数。根据您的问题和样本数据,这似乎是合理的。

    【讨论】:

      【解决方案2】:

      Gordon 的回答向您展示了一种更好的查询方式。但我想解释一下为什么您会在输出中看到这两列:

      您在选择列表中使用派生表_reg 的别名,这意味着您从派生表中检索每一行作为匿名记录。如果您只想要计数,则给该列一个适当的别名并引用外部选择中的 column,而不是 row

      外部选择中的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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 2019-10-11
        • 2019-05-30
        • 1970-01-01
        • 2019-09-10
        相关资源
        最近更新 更多