使用GROUP BY和ORDER BY的mysql查询的奇怪结果

使用GROUP BY和ORDER BY的mysql查询的奇怪结果,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,只是想知道是否有人能发现这里有什么明显的错误。我在MySQL中使用SELECT得到了奇怪的结果。我看不出该查询有任何错误,因此我想知道是否有数据将其抛出,但数据看起来确实正常。。所以我想我的sql有点错误了 我有两张桌子,城市和天气: CITY: CITY_ID INT(3) CITY_NAME VARCHAR(100) WEATHER: CITY_ID INT(3) SDATE DATETIME TEMP INT(3) RAIN

只是想知道是否有人能发现这里有什么明显的错误。我在MySQL中使用SELECT得到了奇怪的结果。我看不出该查询有任何错误,因此我想知道是否有数据将其抛出,但数据看起来确实正常。。所以我想我的sql有点错误了

我有两张桌子,城市和天气:

CITY:
  CITY_ID    INT(3)
  CITY_NAME  VARCHAR(100)

WEATHER:
  CITY_ID   INT(3)
  SDATE     DATETIME
  TEMP      INT(3)
  RAIN      INT(3)
城市桌子很小;每个定义的城市一行

气象台有许多行;它对每个城市都有预测(每天数次)。它也保存了历史预测,所以里面有几个月前的数据

我想在每行上看到每个城市每个月的摘要。 我想要一个月的所有城市信息,然后是上个月的信息等等。 在每个月内,我希望结果按温度(下降)和雨水(下降)顺序排列

因此,我的问题是:

 SELECT     a.city_name                   as CITY
          , DATE_FORMAT(b.sdate, '%M %Y') as MONTH
          , ROUND(avg(b.temp))            as AVG_TEMP_C
          , SUM(b.rain)                   as RAIN
 FROM       CITY a , WEATHER b
 WHERE      a.city_id = b.city_id
 GROUP BY   a.city_name , DATE_FORMAT(b.sdate, '%M %Y')
 ORDER BY   sdate desc,  ROUND(avg(b.temp)) desc , SUM(b.rain) desc;
我期望的结果是:

CITY         MONTH  TEMP   RAIN
ISTANBUL     June   20     0
MUNICH       June   15     9
PARIS        June   15     7
MILAN        June   14     8
ISTANBUL     May    19     22
etc.
我得到的结果是:

CITY         MONTH  TEMP   RAIN
MUNICH       June   15     9
MILAN        June   14     8
ISTANBUL     June   20     0
PARIS        June   15     7
ISTANBUL     May    19     22
etc.

就像我说的,数据看起来还可以,所以我想我在所有格式、连接、分组和排序方式中遗漏了一些内容。

您正在按sdate排序,它位于聚合结果表中,但不是聚合函数的主题。因此,mysql采用与其他条件(可能是第一个条件?)匹配的任何sdate值,并根据该值进行排序

您正在按sdate排序,sdate位于聚合结果表中,但不是聚合函数的主题。因此,mysql采用与其他条件(可能是第一个条件?)匹配的任何sdate值,并根据该值进行排序

这是一个带有显式联接和更合理的表别名(表缩写而不是任意字母)的查询:

排序依据中的第一列是
sdate
。但是,这不包括在
group by
子句中。因此,MySQL为每个城市选择了一个不确定行中的
sdate
(在其他数据库中,这会产生错误)

相反,将您的
订单更改为使用月份和年份:

 ORDER BY   year(sdate) desc,  month(sdate) desc, ROUND(avg(w.temp)) desc , SUM(w.rain) desc;

这是一个带有显式联接和更合理的表别名(表缩写而不是任意字母)的查询:

排序依据中的第一列是
sdate
。但是,这不包括在
group by
子句中。因此,MySQL为每个城市选择了一个不确定行中的
sdate
(在其他数据库中,这会产生错误)

相反,将您的
订单更改为使用月份和年份:

 ORDER BY   year(sdate) desc,  month(sdate) desc, ROUND(avg(w.temp)) desc , SUM(w.rain) desc;

我很想把每个城市/月份的最长日期带回来,然后在ORDER BY(格式化为CCYYMM格式)中使用它,以使它们按正确的顺序排列

大概是这样的:-

SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY DATE_FORMAT(max_date, '%Y%m') desc, AVG_TEMP_C desc , RAIN desc;
SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY YEAR(max_date) desc, MONTH(max_date) desc, AVG_TEMP_C desc , RAIN desc;
或者像这样稍微不同:-

SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY DATE_FORMAT(max_date, '%Y%m') desc, AVG_TEMP_C desc , RAIN desc;
SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY YEAR(max_date) desc, MONTH(max_date) desc, AVG_TEMP_C desc , RAIN desc;

我很想把每个城市/月份的最长日期带回来,然后在ORDER BY(格式化为CCYYMM格式)中使用它,以使它们按正确的顺序排列

大概是这样的:-

SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY DATE_FORMAT(max_date, '%Y%m') desc, AVG_TEMP_C desc , RAIN desc;
SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY YEAR(max_date) desc, MONTH(max_date) desc, AVG_TEMP_C desc , RAIN desc;
或者像这样稍微不同:-

SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY DATE_FORMAT(max_date, '%Y%m') desc, AVG_TEMP_C desc , RAIN desc;
SELECT a.city_name as CITY , 
        DATE_FORMAT(b.sdate, '%M %Y') as MONTH , 
        MAX(b.sdate) AS max_date,
        ROUND(avg(b.temp)) as AVG_TEMP_C , 
        SUM(b.rain) as RAIN 
FROM CITY a 
INNER JOIN WEATHER b 
ON a.city_id = b.city_id 
GROUP BY a.city_name , MONTH
ORDER BY YEAR(max_date) desc, MONTH(max_date) desc, AVG_TEMP_C desc , RAIN desc;

您可以用示例数据集设置示例吗?您可能需要按
DATE\u格式(b.sdate,'%M%Y')
而不是按
日期本身进行排序。样本数据将有助于确定。感谢您的回复,但按日期(b.sdate,%M%Y')格式排序desc将按字母顺序按月排序(因此,5月、3月、6月、4月)您可以用样本数据集设置示例吗?也许您需要按日期(b.sdate,%M%Y')
格式排序,而不是按日期本身排序。样本数据将有助于确定。感谢您的回复,但按日期排序的格式(b.sdate,%M%Y')描述将按字母顺序按月排序(因此5月、3月、6月、4月),在这种情况下,一定要使用
order by year(sdate)desc,month(sdate)desc
仍将导致用于排序的sdate的不确定行值?还是我错过了什么?答对了!非常感谢!那么,只是为了确认一下,我的加入版本是好的,问题是在日期之前的顺序?我确实认为,如果是甲骨文(例如),它会产生一个错误。由于没有抛出错误,我推断mysql的语法是“ok”。。但是,当然,仅仅因为语法是“ok”,并不意味着它会做你想做的事情!我明白为什么只是“按sdate订购”不起作用,但我仍然不知道如何使用年()和月()来解决这个问题。我错过了一些东西。虽然它使用了不确定的sdate行值,但它将使用的任何sdate行值都将共享相同的月份和年份。在这种情况下,使用
ORDER BY year(sdate)desc,month(sdate)desc
仍然会导致不确定的sdate行值用于排序吗?还是我错过了什么?答对了!非常感谢!那么,只是为了确认一下,我的加入版本是好的,问题是在日期之前的顺序?我确实认为,如果是甲骨文(例如),它会产生一个错误。由于没有抛出错误,我推断mysql的语法是“ok”。。但是,当然,仅仅因为语法是“ok”,并不意味着它会做你想做的事情!我明白为什么只是“按sdate订购”不起作用,但我仍然不知道如何使用年()和月()来解决这个问题。我错过了一些东西。虽然它使用了不确定的sdate行值,但它将使用的sdate的任何值都将共享相同的月份和年份。