MySQL ORDER BY 问题

MySQL ORDER BY issues

我试图在一个 SQL 声明中做太多事情。我想在输出 table 的适当位置获得小计和总计。这是我的 SQL;

SELECT Date, DOW, Week, Year, logdate, Month, monum, netID, Logins, 
       creds, newb, netCnt, TOD, netCnt, activity
  FROM (SELECT logdate
              ,activity
              ,DATE( logdate )                      AS Date
              ,DAYOFWEEK( logdate )         AS DOW
              ,WEEK( logdate,0 )              AS Week
              ,YEAR( logdate )              AS Year
              ,DATE_FORMAT( logdate, '%M' )         AS Month
              ,DATE_FORMAT( logdate, '%m' )     AS monum
              ,CONVERT( netID,UNSIGNED INTEGER )    AS netID
              ,COUNT( callsign )                    AS Logins
              ,COUNT( IF(creds <> '',1,NULL) )  AS creds
              ,COUNT( IF(comments LIKE '%first log in%',1,NULL) ) AS newb
              ,count( DISTINCT netID )      AS netCnt
              ,SUM(  DISTINCT netID)            AS allCnt
              ,SEC_TO_TIME( SUM(timeonduty) )       AS TOD
         FROM NetLog
        WHERE netID <> 0 
          AND activity NOT LIKE '%TEST%'
          AND netcall LIKE '%W0KCN%'
          AND substr(logdate,1,4) = 2017
    GROUP BY Month, netID WITH ROLLUP ) AS t 
    ORDER BY t.logdate , logins

(缩写)输出如下所示;

您会注意到每个月的顺序都是正确的,直到您到达 10 月。总计在 10 月之前而不是在结束时(12 月之后)进行排序。这是我可以在 SQL 中控制的东西,还是我应该在 PHP 中解决这个问题?我如何在 SQL 中修复它?

您的第二个字段 logins 将仅在第一个已排序列的相等值内进行相应排序。否则,排序优先于第一列。尝试交换 logdatelogins 看看会发生什么。

原来我需要一个 CASE 语句来让它工作。

SELECT Date, DOW, Week, Year,  Month, monum, netID, Logins, 
       creds, newb, netCnt, TOD, activity, logdate,
       COALESCE (Month, 'GT') as MonthNM
  FROM (SELECT logdate
              ,activity
              ,DATE( logdate )                      AS Date
              ,DAYOFWEEK( logdate )                 AS DOW
              ,WEEK( logdate,0 )                    AS Week
              ,YEAR( logdate )                      AS Year
              ,MONTHNAME ( logdate )                AS Month
              ,MONTH( logdate )                     AS monum
              ,CONVERT( netID,UNSIGNED INTEGER )    AS netID
              ,COUNT( callsign )                    AS Logins
              ,COUNT( IF(creds <> '',1,NULL) )      AS creds
              ,COUNT( IF(comments LIKE '%first log in%',1,NULL) ) AS newb
              ,count( DISTINCT netID )              AS netCnt
              ,SUM(  DISTINCT netID)                AS allCnt
              ,SEC_TO_TIME( SUM(timeonduty) )       AS TOD
         FROM NetLog
        WHERE netID <> 0 
          AND activity NOT LIKE '%TEST%'
          AND netcall LIKE '%W0KCN%'
          AND substr(logdate,1,4) = 2017
    GROUP BY Month, netID WITH ROLLUP ) AS t 
    ORDER BY 
     CASE
        WHEN MonthNM = 'GT' THEN  1
        ELSE 0
     END
        ,monum
        ,logins