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
将仅在第一个已排序列的相等值内进行相应排序。否则,排序优先于第一列。尝试交换 logdate
和 logins
看看会发生什么。
原来我需要一个 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
我试图在一个 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
将仅在第一个已排序列的相等值内进行相应排序。否则,排序优先于第一列。尝试交换 logdate
和 logins
看看会发生什么。
原来我需要一个 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