只是想知道是否有人能在这里发现任何明显的错误。我在 MySQL 中使用 SELECT 得到了奇怪的结果。我看不出查询有任何问题,所以我想知道是否有某些数据将其丢弃,但数据看起来确实没问题。所以我猜我的 sql 出了点问题!
我有 2 个表,CITY 和 WEATHER:
CITY:
CITY_ID INT(3)
CITY_NAME VARCHAR(100)
WEATHER:
CITY_ID INT(3)
SDATE DATETIME
TEMP INT(3)
RAIN INT(3)
CITY 表很小;每个定义的城市一行。
WEATHER 表有很多行;它有每个城市的预报(每天几次)。还保留历史预测,因此其中有几个月前的数据。
我想在每一行查看每个城市每个月的摘要。 我想要一个月的所有城市信息,然后是上个月等。 在每个月内,我希望结果按温度(降序)和雨量(降序)排序。
所以,我的查询:
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.
就像我说的,数据看起来没问题,所以我想我在所有格式、连接、分组和排序中遗漏了一些东西......
最佳答案
这是带有显式连接和更合理的表别名(表缩写而不是任意字母)的查询:
SELECT c.city_name as CITY,
DATE_FORMAT(w.sdate, '%M %Y') as MONTH,
ROUND(avg(w.temp)) as AVG_TEMP_C,
SUM(w.rain) as RAIN,
FROM CITY a JOIN
WEATHER w
ON c.city_id = w.city_id
GROUP BY c.city_name , DATE_FORMAT(w.sdate, '%M %Y')
ORDER BY sdate desc, ROUND(avg(w.temp)) desc , SUM(w.rain) desc;
order by
中的第一列是 sdate
。但是,这不包含在您的 group by
子句中。因此,MySQL 会从不确定的行中为每个城市选择一个 sdate
的值(在其他数据库中,这会产生错误)。
相反,将您的order by
更改为使用月份和年份:
ORDER BY year(sdate) desc, month(sdate) desc, ROUND(avg(w.temp)) desc , SUM(w.rain) desc;
关于mysql - 使用 GROUP BY 和 ORDER BY 的 mysql 查询的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23956408/