2016-08-19 69 views
1

我有两个表用户,有些用户可以有相同的unq_idGROUP BY使用另一台

我想选择所有不同unq_id用户votes它们排序来自的票数表。

但结果并不如我预期的那样,票数是重复的。你可以看到在下面的图像

enter image description here

SELECT DISTINCT u.unq_id, COUNT(v.id) AS count_votes 
FROM users u 
INNER JOIN votes v 
ON u.unq_id = v.unq_id 
WHERE u.unq_id <> '' 
GROUP BY u.unq_id; 

SQLFiddle:http://sqlfiddle.com/#!9/e0bb35/1

预期结果:

3fyx6 - 3 
9kx9mq - 1 
+0

一般GROUP BY规则说:如果指定了GROUP BY子句,在SELECT列表中的每个列引用必须要么识别分组列或者是设置功能的参数! – jarlh

+0

你的表格关系看起来很奇怪。你应该有一个唯一的标识符来加入你目前没有的。这是行不通的。 –

+0

通常在GROUP BY时不需要做SELECT DISTINCT。 – jarlh

回答

2

为了让你不需要加入到users期望的结果,但根据您的评论“一些用户根本没有投票,我想把它们放在名单上”你应该在离开之前聚合连接:

SELECT DISTINCT 
    u.unq_id, 
    COALESCE(v.count_votes, 0) 
FROM users u 
LEFT JOIN 
(select unq_id, count(*) as count_votes 
    from votes 
    group by unq_id 
) v 
ON u.unq_id = v.unq_id 
WHERE u.unq_id <> ''; 
3

尝试改变

SELECT DISTINCT u.unq_id, COUNT(v.id) AS count_votes 

SELECT DISTINCT u.unq_id, COUNT(distinct v.id) AS count_votes 

,看看它是否帮助:)

+0

它似乎工作 –

+0

如果你想包括没有任何注册投票的用户,我会改变从内部加入到左侧加入:) – Moptan

+0

重复的问题是加入两个表时重复的数据的性质在两个连接的列中 – Moptan

1

这会工作:

select distinct v.unq_id, count(distinct v.id) as votes 
from users u 
inner join votes v 
on u.unq_id = v.unq_id 
group by v.unq_id 
order by 2 desc; 

但我宁愿使用子查询,我认为这将是更快:

select v.unq_id, count(v.unq_id) as votes 
from votes v 
where v.unq_id in (select unq_id from users group by unq_id) 
group by v.unq_id 
order by 2 desc;