使用GROUP BY和ORDER BY的mysql查询的奇怪结果
只是想知道是否有人能发现这里有什么明显的错误。我在MySQL中使用SELECT得到了奇怪的结果。我看不出该查询有任何错误,因此我想知道是否有数据将其抛出,但数据看起来确实正常。。所以我想我的sql有点错误了 我有两张桌子,城市和天气:使用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
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的任何值都将共享相同的月份和年份。