2016-08-19 67 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;