2010-07-26 152 views
2

下面的輸入按照反向時間順序按照稱爲「datesubmitted」的時間戳字段對提交進行排序。該字段位於名爲「提交」的MySQL表中。由兩個字段排序

另一個MySQL表「comment」有另一個時間戳字段,稱爲「datecommented」。

每個提交只有一個「日期提交」,但它可能有幾個評論,每個評論都有不同的「日期評論」。

我怎樣才能通過「datesubmitted」和每個人的最後「日期評論」排序提交?換句話說,我希望此列表的頂部顯示最近提交的條目或最近評論的條目,以最近發生的大部分爲準。

由於提前,

約翰

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

$tzFrom = new DateTimeZone('America/New_York'); 
$tzTo = new DateTimeZone('America/Phoenix'); 



// echo $dt->format(DATE_RFC822); 


$result = mysql_query($sqlStr); 

$arr = array(); 
echo "<table class=\"samplesrec\">"; 
while ($row = mysql_fetch_array($result)) { 
    $dt = new DateTime($row["datesubmitted"], $tzFrom); 
    $dt->setTimezone($tzTo); 
    echo '<tr>'; 
    echo '<td class="sitename1"><a href="http://www.'.$row["url"].'" TARGET="_blank">'.$row["title"].'</a> <div class="dispurl">'.$row["displayurl"].'</div></td>'; 
    echo '</tr>'; 
    echo '<tr>'; 
    echo '<td class="sitename2name">Submitted by <a href="http://www...com/.../members/index.php?profile='.$row["username"].'">'.$row["username"].'</a> on '.$dt->format('F j, Y &\nb\sp &\nb\sp g:i a').'</td>'; 

    echo '</tr>'; 
    echo '<tr>'; 
    echo '<td class="sitename2"><a href="http://www...com/.../comments/index.php?submission='.$row["title"].'&submissionid='.$row["submissionid"].'&url='.$row["url"].'&countcomments='.$row["countComments"].'&submittor='.$row["username"].'&submissiondate='.$row["datesubmitted"].'&dispurl='.$row["displayurl"].'">'.$row["countComments"].' comments</a></td>'; 
    echo '</tr>'; 
    } 
echo "</table>";  
+1

你錯過了'LEFT'和'OUTER'之間的換行符。 ;-) – 2010-07-26 23:03:55

回答

4
SELECT s.loginid, s.title, s.url, s.displayurl, s.datesubmitted, l.username, 
    s.submissionid, COUNT(c.commentid) countComments, 
    GREATEST(s.datesubmitted, COALESCE(MAX(c.datecommented), s.datesubmitted)) AS most_recent 
FROM submission s 
INNER JOIN login l ON s.loginid = l.loginid 
LEFT OUTER JOIN comment c ON s.submissionid = c.submissionid 
GROUP BY s.submissionid 
ORDER BY most_recent DESC 
LIMIT 10 
+0

謝謝,比爾卡爾文。 – John 2010-07-26 23:21:01

0

您可以通過多列中間用逗號分隔訂購。所以你可以做... ORDER BY s.datesubmitted DESC, c.datecommented DESC。同樣,如果兩者都是相同的方向(asc/desc),最後可以只說一次。查詢將按列表中的第一列進行排序,然後在下一列進行排序,以便按組排序。

2

這聽起來像你想有條件地ORDER BY,取決於哪個日期更高。包括這個ORDER BY

ORDER BY CASE WHEN datesubmitted > datecommented 
     THEN datesubmitted 
     ELSE datecommented END DESC 
+1

簡短,優雅,重點突出。 – Kelsey 2010-07-26 23:09:31

+0

我試過了,它沒有工作。但我代表我感謝您的努力。 – John 2010-07-26 23:21:20