2011-05-20 61 views
0

以下查詢效果很好。它以兩層結果命令,均基於s.pointsMySQL ORDER BY,CASE根據每個案例的不同字段

  • 第1層:所有結果均爲s.datesubmitted最近一小時內。
  • 第2層:所有結果均以s.datesubmitted之前的1小時前爲準。

第1層的結果優先於第2層。因此,無論s.points如何,在過去一小時內提交的任何內容都將顯示在超過一小時前提交的任何內容之上。

第2層中的結果都是1小時前提交的所有項目。與第1層類似,它們由s.points訂購。我怎麼能離開由s.points訂購的第1層,而是通過most_recent訂購第2層?

由於提前,

約翰

$sqlStr = "SELECT s.loginid, s.title, s.url, s.displayurl, s.points, s.datesubmitted, l.username, 
       s.submissionid, s.subcheck, s.topten, COUNT(c.commentid) countComments, 
       GREATEST(s.datesubmitted, COALESCE(MAX(c.datecommented), s.datesubmitted)) AS most_recent 
      FROM submission s 
      JOIN login l ON s.loginid = l.loginid 
    LEFT JOIN comment c ON s.submissionid = c.submissionid 
     GROUP BY s.submissionid 
     ORDER BY 
     CASE 
       WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN 0 
       WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN 1 
       ELSE 2 
       END, s.points DESC 

     LIMIT $offset, $rowsperpage"; 

回答

0
ORDER BY CASE 
      WHEN s.datesubmitted >= DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN CONCAT(1, ',', s.points) 
      WHEN s.datesubmitted < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN CONCAT(0, ',', s.datesubmitted) 
     END DESC 

在這種情況下:

  • 1級:在一個小時內的所有記錄將被points DESC
  • 級進行排序2:所有其他記錄按排序(最新)
0
SELECT 
    loginid, title, url, displayurl, points, datesubmitted, username, 
    submissionid, subcheck, s.topten, countComments, most_recent 
FROM (
    SELECT 
    s.loginid, s.title, s.url, s.displayurl, s.points, s.datesubmitted, l.username, 
    s.submissionid, s.subcheck, s.topten, COUNT(c.commentid) countComments, 
    GREATEST(s.datesubmitted, COALESCE(MAX(c.datecommented), s.datesubmitted)) AS most_recent, 
    s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) AS is_within_hour 
    FROM submission s 
    INNER JOIN login l ON s.loginid = l.loginid 
    LEFT JOIN comment c ON s.submissionid = c.submissionid 
    GROUP BY s.submissionid 
) x 
ORDER BY 
    is_within_hour DESC, 
    CASE WHEN  is_within_hour THEN points  END DESC, 
    CASE WHEN NOT is_within_hour THEN datesubmitted END DESC 
LIMIT $offset, $rowsperpage 
相關問題