2017-04-10 3 views
0

Ich habe zwei Tabellen in meiner MySQL-Datenbank:mysql zwei verschiedene Tabellen beitreten

user  
- sid 
- userid 
- username 

log 
- sid 
- userid 
- login_time 

Wie Sie sich vorstellen können, gibt es viel mehr Datensätze in Log-Tabellen als in Benutzertabelle. Ich verwende PHP, um diese Datensätze auf meiner Website in einem Tabellenformat wie unten dargestellt zu präsentieren.

no | userid | username | number of login | 
1 | inzo | harvey |  233  | 
2 | chae | schmidts |  433  | 
3 | hibro | swainy |  12   | 

Um die Anzahl von Login- für jeden Benutzer, ich weitere Anfragen in einem for-Anweisung senden. Aber es verbraucht Ressourcen und macht den Server am Ende langsam.

Kann ich dieses Ergebnis in einer einzigen Join-Abfrage haben?

+1

enthalten, was Sie versucht haben. Dann erhalten Sie die Lösung –

Antwort

2

Ja, Sie können, müssen Sie die Anmeldungen mit Ihnen group by

select t1.userid, t1.username, count(t2.sid) 
from user t1 
left join 
     log t2 
on  t1.userid = t2.userid 
group by t1.userid, t1.username 

Die left join gewährleistet für jeden Benutzer zählen, dass Benutzer ohne Anmeldungen werden noch zurückgegeben werden, Witz 0 als Graf.

bearbeiten

über die Frage im Kommentar: Wenn Sie nur die Anmeldungen mit einem bestimmten Flag-Wert zählen mögen, können Sie einfach where flag = x hinzufügen, bevor die group by; Wenn Sie für jeden Wert des Flags eine separate Zählung durchführen möchten, müssen Sie dieses Flag sowohl group by als auch select hinzufügen.

+0

Danke Herr Zanini, was ist, wenn es eine andere Spalte "Flag" (zB: 0 oder 1) in der Log-Tabelle, und ich brauche Referenz Flag-Spalte, um die Anzahl der Login. Ich meine, ich brauche WHERE-Klausel, um zu zählen (t2.sid) ?? – user1942626

+0

Bearbeitete meine Antwort –

0
SELECT TABLE_A.row_id, TABLE_A.category, TABLE_A.val_1, TABLE_B.val_2 
FROM TABLE_B 
LEFT OUTER JOIN TABLE_A ON TABLE_B.row_id = TABLE_A.row_id 
ORDER BY row_id; 

Wenn Sie alle Ergebnisse wollen, brauchen Sie eine äußere Verbindung, keine innere.

1

denke ich am besten und damit meine ich am wenigsten Ressourcen Art und Weise raubend wäre „number_of_login“, um Benutzertabelle hinzuzufügen und es nur jedes Mal erhöhen er/sie angemeldet ist, weil eine andere Lösung erfordert Looping

0

Wählen Sie a.sid, a.userid, a.username, COUNT (b.sid) von Benutzer a Left join log b ON b.sid = a.sid Gruppe von a.sid