2010-05-31 57 views
0

我用三個MySQL表:加入查詢不能

評論

commentid loginid submissionid comment datecommented 

登錄

loginid username password email actcode disabled activated created points 

提交

submissionid loginid title url displayurl datesubmitted 

在這三個表中,「登錄ID 「對應。

我想根據「submissionid」的數量拉前10名loginids。我想將它們顯示在一個3列的HTML表格中,該表格顯示了第一列中的「用戶名」,第二列中的「submissionid」的數量以及第三列中的「commentid」的數量。

我嘗試使用下面的查詢,但它沒有奏效。任何想法爲什麼不呢?

由於提前,

約翰

$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>"; 

回答

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

謝謝...這似乎顯示僅至少有一個submissionid代表登錄ID。我怎麼能顯示沒有submitidsids的loginids? – John 2010-05-31 14:38:16

+0

正確,然後用左連接替換JOIN。 – nuqqsa 2010-05-31 14:44:57

+1

請參閱更新後的查詢,它還包含將NULL值轉換爲0. – nuqqsa 2010-05-31 14:52:09

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

在查詢,您可以選擇非組項目,如commentid,評論等 這應該得到期望結果。

選擇l.username,計數(s.submissionid)作爲NoOfSubmissions,計數(c.commentid),如從註解C1 INNER JOIN提交小號NoOfComments ON c.submissionid = s.submissionid INNER JOIN登錄升ON l.loginid = c.loginid group by l.username order by count(s.submissionid)limit 10;

感謝,

Rinson KE DBA 91 + 9995044142 www.qburst.com