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

标签 mysql sql group-by sql-order-by

只是想知道是否有人能在这里发现任何明显的错误。我在 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/

相关文章:

Mysql 从列表中选择全部并在另一个列表上按日期排序

php - PHP 的提要生成器,允许 åäö 和图像

mysql - 每组选择 N 条随机记录

SQL Server组合键问题

php - MySQL 显示多对多关系的结果

SQL - 根据数字差异进行分组

mysql - 在插入之前创建Mysql触发器

mysql - 如何只从 MySQL 的字段中选择第一个不同的匹配项?

mysql 到 postgresql 查询转换

python-3.x - Pandas 通过取列之间的平均值来合并两个数据帧