2016-11-06 11 views
0

Ich habe 3 Tabellen, die ich abfragen muss, wo ich nach 2 Spalten gruppieren muss und auch die Tabellen beitreten, aber immer noch alle Ergebnisse zurückgeben.Gruppieren Sie nach 2 Spalten mit 2 Joins und geben Sie alle Zeilen mit Summen zurück

Users 
ID User_name Category Reason Change_date 
1 John  1  2  2016-01-05 
2 James  3  1  2015-10-02 
3 Peter  1  4  2016-01-04 
4 Tony  1  4  2016-01-15 
5 Fred  1  4  2016-02-25 
6 Rick  3  2  2016-04-19 
7 Sonia  2  1  2016-10-14 
8 Michelle 2  2  2015-11-09 
9 Phillip 3  3  2016-03-01 
10 Simon  3  3  2016-03-07 

Category 
ID Category_name 
1 User 
2 Super user 
3 Admin 

Reason 
ID Reason_name 
1 Promotion 
2 Upgrade 
3 Sponsor 
4 Normal 

habe ich einige der Suche und fand https://stackoverflow.com/a/28158276/1278201 und modifizierte meine Abfrage, um zu versuchen und es zu verwenden:

SELECT category_name, reasons.reason_name, u1.id as user_id, user_name 
from users as u1 
JOIN (SELECT id from users where users.change_date BETWEEN '2016-01-01' 
AND '2016-11-06' group by users.category, users.reason) AS u2 
ON u1.id = u2.id 
left join reason on u1.reason=category.id 
left join category on u1.category=category.id 

Die Ergebnisse werden nur dann zurückgegeben werden, um die Gruppe mit durch - ich sollte 8 Zeilen zurück, aber ich bekomme nur 5, was für jedes Vorkommen eines jeden Grundes in jeder Kategorie eins ist.

Mein erwartetes Ergebnis ist:

category_name reason_name   user_id user_name 
User   Upgrade    1  John 
                    "Upgrade" count  1 
       Normal    3  Peter 
            4  Tony 
            5  Fred 
                    "Normal" count  3 
                    "User" count   4 
Super user Promotion    7  Sonia 
                    "Promotion" count  1 
                    "Super user" count 1 
Admin   Upgrade    6  Rick 
                    "Upgrade" count  1 
       Sponsor    9  Phillip 
            10  Simon 
                    "Sponsor" count  2 
                    "Admin" count   3 

Wie kann ich alle 8 Reihen als auch zurück in der Lage, zählt jeder für category_name und reason_name zu bekommen?

+0

Was sind Sie mit 'Ü2' versuchen zu tun? –

+0

Ich änderte meine ursprüngliche Abfrage mit der Antwort, mit der ich verlinkt bin - ich denke, die Idee ist, dass Sie sich selbst anschließen, damit Sie dann alle Daten anzeigen können und nicht nur die gruppierten Ergebnisse – bhttoan

+0

Verwenden Sie nicht 'GROUP BY' in der Unterabfrage . Sie wählen einen zufälligen Benutzer aus jeder Gruppe aus. – Barmar

Antwort

0

Sie sollten GROUP BY nicht in der Unterabfrage verwenden, da dann nur eine Benutzer-ID aus jeder Gruppe zurückgegeben wird.

In der Tat brauchen Sie die Unterabfrage überhaupt nicht. Sie können einfach eine WHERE-Klausel verwenden, um Benutzer auszuwählen, die die Kriterien change_date erfüllen.

SELECT category_name, reasons.reason_name, u1.id as user_id, user_name 
from users as u1 
left join reason on u1.reason=category.id 
left join category on u1.category=category.id 
where u1.change_date BETWEEN '2016-01-01' AND '2016-11-06' 

Um Teilsummen der Gruppierungen nach Kategorie und Grund zu erhalten, können Sie GROUP BY und WITH ROLLUP verwenden.

SELECT category_name, reasons.reason_name, u1.id as user_id, user_name, COUNT(*) AS total 
from users as u1 
left join reason on u1.reason=category.id 
left join category on u1.category=category.id 
where u1.change_date BETWEEN '2016-01-01' AND '2016-11-06' 
GROUP BY category_name, reason_name, user_id WITH ROLLUP 

Im Skript, das die Ergebnisse zeigt, sind die Summen in den Zeilen, in denen user_idNULL ist. Die Kategorie Summen haben auch reason IS NULL. So können Sie diese Zeilen im Skript, das die Ergebnisse anzeigt, entsprechend anzeigen. Wenn Sie wirklich alles in MySQL tun müssen, können Sie die obige Abfrage in eine Unterabfrage stellen, und die enthaltene Abfrage kann auf user_id IS NULL und reason_name IS NULL testen.

+0

Entschuldigung, das gibt mir alle Zeilen und das ist mehr oder weniger was ich ursprünglich hatte - die Gruppe von wurde hinzugefügt so könnte ich Summen nach Kategorie und Grund bekommen – bhttoan

+0

Get Summen in einer separaten Abfrage, wie 'SELECT Kategorie, Grund, COUNT (*) als Summe von Benutzern GROUP BY Kategorie, Grund '. Dann schließe dich dem mit den anderen Tischen an. – Barmar

+0

Ah OK, das macht Sinn! Muss ich zweimal beitreten, um die individuellen Summen zu erhalten? – bhttoan

0

Für das, was Sie suchen in dem erwarteten Ausgang, könnte dies sein, was Sie suchen:

SELECT 
Category_name, reason_name, users.ID,User_name 
FROM 
    Users 
    inner join Category on Category.ID=Users.Category 
    inner join Reason on Reason.ID=Users.Reason 
where users.change_date BETWEEN '2016-01-01' AND '2016-11-06' 

SQLFiddle

Verwandte Themen