2017-02-25 7 views
1

Ich bin neu bei MySql und ich habe ein Problem beim Bestellen des Ergebnisses einer Abfrage.mysql Abfrage mehrere Tabellen und Zeile zählen

Ich habe 2 Tabellen:

Table1 die Nutzer meines Systems enthält

userId userName 
01  Ken 
02  John 
03  Bob 
04  Steve 

Table2 enthält die Anhänger jeder Benutzer

userId, FollowerId. 
02  01 
01  02 
02  03 
02  04 

so, in diesem Fall John hat 3 Anhänger : Ken, Bob und Steve.

Ich möchte eine dritte Tabelle mit 2 Spalten generieren: Benutzer der Datenbank und Anzahl der Follower pro Benutzer. Ich möchte die Tabelle nach Anzahl der Follower geordnet haben.

userId NrFollowers 
    02 3 
    01 1 
    03 0 
    04 0 

im Moment bin ich den folgenden Code als erforderlich verwenden

$stmt = $conn->prepare("SELECT userId, userName FROM Table1"); 
    $stmt->execute(); 
    $stmt->store_result(); 
    $stmt->bind_result($userId, $userName); 
     while($stmt->fetch()) { 
       //count number followers 
       $stmtfl = $conn->prepare("SELECT * FROM Table2 WHERE userId = (?)"); 
       $stmtfl->bind_param("s", $userId); 
       $stmtfl->execute(); 
       $stmtfl->store_result(); 
       $stmtfl->fetch(); 
       $followCount= $stmtfl->num_rows; 

       //now I have $userName and $NrFollowers 

Diese Lösung ist nicht eine Schleife für jede databases`s Benutzer optimiert und erlaubt nicht die Benutzer nach der Anzahl der bestellen Anhänger.

Kann mir bitte jemand helfen, die richtige Mysql-Abfrage zu schreiben?

Antwort

1

Für SQL-Abfrage, können Sie dies versuchen:

select 
    tbl1.userId, 
    count(distinct tbl2.FollowerId) as NrFollowers 
from tbl1 
left join tbl2 
on tbl1.userId = tbl2.userId 
group by tbl1.userId 
order by count(distinct tbl2.FollowerId) desc 

Siehe demo hier.

+0

Ihnen sehr danken. Ich habe die Demo angeschaut. Es ist genau das, was ich gesucht habe :) – zorzihit

1
SELECT u.usersId, COUNT(f.FollowerId) AS NrFollowers 
FROM users u 
LEFT JOIN followers f ON f.userId = u.userId 
GROUP BY u.userId 
+0

Vielen Dank – zorzihit

1

Verwendung Code unten ..

SELECT u.usersId, coalesce(COUNT(f.FollowerId) ,0)AS NrFollowers 
FROM users u 
LEFT JOIN followers f ON f.userId = u.userId 
GROUP BY u.userId 
order by coalesce(COUNT(f.FollowerId) ,0) desc 
+0

Vielen Dank – zorzihit