2016-08-19 2 views
1

Ich habe zwei Tabellen Benutzer und Stimmen und einige Benutzer können gleiche haben unq_idGROUP BY eine andere Tabelle mit

Ich versuche, alle verschiedeneunq_id von Benutzer auswählen und sortieren sie nach votes von votes tabelle.

Aber die Ergebnisse sind nicht wie ich erwartet habe, die Stimmen sind doppelt vorhanden. http://sqlfiddle.com/#!9/e0bb35/1

Erwartete Ergebnisse: Sie können

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 Bild unten sehen in

3fyx6 - 3 
9kx9mq - 1 
+0

Die allgemeine GROUP BY-Regel sagt: Wenn eine GROUP BY-Klausel angegeben ist, jede Spalte Verweis in der SELECT-Liste muss entweder Identifiziere eine Gruppierungsspalte oder sei das Argument einer gesetzten Funktion! – jarlh

+0

Ihre Tabellenbeziehung sieht komisch aus. Sie sollten einen eindeutigen Bezeichner haben, dem Sie noch nicht beigetreten sind. Das kann nicht funktionieren. –

+0

In der Regel müssen Sie SELECT DISTINCT nicht ausführen, wenn GROUP BY. – jarlh

Antwort

2

Um das gewünschte Ergebnis zu erhalten, brauchen Sie nicht zu users zu verbinden, aber basierend auf deinem Kommentar "einige Benutzer haben überhaupt keine Stimmen und ich möchte sie auf die Liste setzen" Sie vor einem LEFT aggregieren sollten beitreten:

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

Versuchen

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

zu

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

Und sehen, ob es hilft :)

+0

es scheint zu arbeiten –

+0

Und wenn Sie Benutzer ohne irgendwelche registrierten Stimmen einschließen möchten, würde ich von innerer Verbindung zu einer linken Verbindung wechseln :) – Moptan

+0

Das Problem mit den Duplikaten ist die Art der Verbindungen, wenn Sie zwei Tabellen mit duplizierten Daten verbinden in beiden verknüpften Spalten – Moptan

1

Dies funktionieren würde:

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; 

Aber ich würde lieber Unterabfrage verwenden, ich glaube, es wäre viel schneller sein:

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;