我做了一个查询,显示了我想要的结果(足够接近)......但它并不完美。
我计算每个用户的寄存器数量。
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"在此查询的结果中?
谢谢..
答案 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;