2010-05-31 5 views
0

J'utilise trois tables MySql:requête de jointure ne fonctionne pas

commentaire

commentid loginid submissionid comment datecommented 

connexion

loginid username password email actcode disabled activated created points 

soumission

submissionid loginid title url displayurl datesubmitted 

Dans ces trois tableaux, la « loginid "correspondre.

Je voudrais tirer le top 10 des identifiants basés sur le nombre de "soumission". Je voudrais les afficher dans un tableau HTML à trois colonnes qui montre le "nom d'utilisateur" dans la première colonne, le nombre de "submissionid" dans la deuxième colonne, et le nombre de "commentid" dans la troisième colonne.

J'ai essayé d'utiliser la requête ci-dessous mais cela n'a pas fonctionné. Une idée pourquoi pas?

Merci à l'avance,

John

$sqlStr = "SELECT 
       l.username 
       ,l.loginid 
       ,c.commentid 
       ,count(s.commentid) countComments 
       ,c.comment 
       ,c.datecommented 
       ,s.submissionid 
       ,count(s.submissionid) countSubmissions 
       ,s.title 
       ,s.url 
       ,s.displayurl 
       ,s.datesubmitted 
      FROM comment AS c 
     INNER JOIN login AS l ON c.loginid = l.loginid 
     INNER JOIN submission AS s ON c.loginid = s.loginid 
     GROUP BY c.loginid 
     ORDER BY countSubmissions DESC 
      LIMIT 10"; 

    $result = mysql_query($sqlStr); 

$arr = array(); 
echo "<table class=\"samplesrec1\">"; 
while ($row = mysql_fetch_array($result)) { 
    echo '<tr>'; 
    echo '<td class="sitename1"><a href="http://www...com/.../members/index.php?profile='.$row["username"].'">'.stripslashes($row["username"]).'</a></td>'; 
    echo '</tr>'; 
    echo '<td class="sitename1">'.stripslashes($row["countSubmissions"]).'</td>'; 
    echo '</tr>'; 
    echo '</tr>'; 
    echo '<td class="sitename1">'.stripslashes($row["countComments"]).'</td>'; 
    echo '</tr>'; 
    } 
echo "</table>"; 

Répondre

1
SELECT 
    l.loginid, 
    l.username, 
    COALESCE(s.total, 0) AS numSubmissions, 
    COALESCE(c.total, 0) AS numComments 
FROM login l  
LEFT JOIN (
    SELECT loginid, COUNT(1) AS total 
    FROM submission 
    GROUP BY loginid 
) s ON l.loginid = s.loginid 
LEFT JOIN (
    SELECT loginid, COUNT(1) AS total 
    FROM comment 
    GROUP BY loginid 
) c ON l.loginid = c.loginid 
GROUP BY l.loginid 
ORDER BY numComments DESC 
+0

Merci ... cela semble afficher uniquement loginids qui ont au moins un submissionId. Comment est-ce que je pourrais avoir des loginid d'affichage qui n'ont pas de soumission? – John

+0

À droite, remplacez JOIN par LEFT JOIN. – nuqqsa

+1

S'il vous plaît voir la requête mise à jour, il comprend également la conversion des valeurs NULL à 0. – nuqqsa

0
select 
l.username, 
s.submissions, 
c.comments 
from 
l, 
(
    select 
    count(s.submissionid) as submissions, 
    s.loginid 
    from 
    submission s 
    group by 
    s.loginid 
) s, 
(
    select 
    count(c.commentid) as commentids, 
    c.loginid 
    from 
    comment c 
    group by 
    c.loginid 
) c 
where 
l.loginid = s.loginid and 
l.loginid = c.loginid 
order by 
s.submissions desc 
limit 
10 
1

Dans votre requête, vous avez sélectionné des éléments non-groupe tels que CommentID, etc. commentaire Cela devrait donner le choix résultat.

select l.username, count (s.submissionid) comme NoOfSubmissions, compter (c.commentid) comme NoOfComments de commentaires c INNER JOIN soumission s SUR c.submissionid = s.submissionid INNER JOIN connexion l l.loginid ON = groupe c.loginid par l.nom d'utilisateur par nombre (s.smission) limite 10;

Merci,

Rinson KE DBA 91 + 9995044142 www.qburst.com