2016-04-19 7 views
2

Angenommen, ich besitze eine Tabelle SESSIONS mit zwei Spalten - "session_id" und "username", die mir sagt, welcher Benutzer an welcher Sitzung in meiner Site beteiligt war. Ich habe auch eine andere Tabelle USERS mit Spalten "Benutzername" und "Land". Nun, wenn ich wissen will, wie viele Sitzungen von jedem Land kamen, ichSQL: Standardwerte für Zeilen, die keinem JOIN-Kriterium entsprechen?

SELECT count(*), sessions.username, users.country 
FROM sessions 
INNER JOIN users 
ON sessions.username=users.username 
GROUP BY country 

Jetzt hier ist das Problem: nicht jeder Benutzer in der SESSIONS Tabelle tatsächlich eine Zeile in der Tabelle USERS hat. Für diese Benutzer möchte ich "unbekannt" für Land schreiben, aber nicht ihre Sitzungen vollständig ignorieren.

Gibt es einen "richtigen" Weg, es direkt in der SQL-Abfrage zu tun? Ich kann immer PHP Magie nach geeigneten Abfragen, oder Benutzer hinzufügen, um die USERS-Tabelle, wenn eine Zeile hinzugefügt SESSIONS mit einem Benutzer nicht derzeit in USERS, aber ich frage mich, ob es gibt einige SQL-Weg zum Erkennen der "fehlenden" Zeilen und weisen ihnen einen Standardwert zu.

+3

Ungültige Gruppe durch Abfrage benötigen ... Die allgemeine GROUP BY-Regel sagt: „Wenn ein GROUP BY-Klausel angegeben ist, jede Spalte Verweis in der SELECT-Liste muss entweder eine Gruppierungsspalte identifizieren oder das Argument einer Set-Funktion sein. " – jarlh

Antwort

3

Es heißt OUTER verbinden (im Gegensatz zu INNER).

Genauer gesagt, können Sie LEFT OUTER JOIN verwenden, die alle Zeilen aus der „linken“ Tabelle zurückgibt (sessions), auch wenn es in der „richtigen“ Tabelle (users) keine entsprechende Zeile ist. In diesem Fall wären die zurückgegebenen Werte für die Tabelle usersNULL. Sie können die Standardfunktion COALESCE verwenden, um diese NULL Werte durch einen anderen Wert wie "unbekannt" zu ersetzen.

SELECT 
    count(*) AS Cnt 
    ,COALESCE(users.country, 'unknown') AS Country 
FROM 
    sessions 
    LEFT JOIN users ON sessions.username=users.username 
GROUP BY users.country; 
2

Verwenden Left Join erreichen Ausgang

SELECT count(*), sessions.username, ISNULL(users.country,'Unknown') 
FROM sessions 
LEFT JOIN users ON sessions.username=users.username 
GROUP BY sessions.username, users.country 
Verwandte Themen