【问题标题】:Select where max Mysql选择最大Mysql的位置
【发布时间】:2017-06-01 22:34:11
【问题描述】:

帮助,请让 sql 选择到数据库。有这样的数据。

我的桌子是:

id  news_id  season  seria   date_update
---|------|---------|-----|--------------------
1  | 4    | 1       | 7   | 2017-04-14 16:38:10
2  | 4    | 1       | 7   | 2017-04-14 17:38:10
5  | 4    | 1       | 7   | 2017-04-14 16:38:10
3  | 4    | 1       | 7   | 2017-04-14 16:38:10
4  | 4    | 1       | 7   | 2017-04-14 16:38:10
6  | 4    | 1       | 7   | 2017-04-14 16:38:10
7  | 4    | 1       | 7   | 2017-04-14 16:38:10
8  | 1    | 1       | 25  | 2017-04-23 18:42:00

需要将所有单元格按最大季节、序列和日期分组,并按 date_update DESC 排序。

结果我需要下一行

id  news_id  season  seria   date_update
---|------|---------|-----|--------------------
8  | 1    | 1       | 25  | 2017-04-23 18:42:00
2  | 4    | 1       | 7   | 2017-04-14 17:38:10

因为这一行在每个 news_id 中具有最高的季节和 seria 和 date_update。即我需要选择具有最高季节和序列的数据以及按 news_id 分组的 date_update 并按 date_update DESC 排序

我试过了,但数据并不总是正确的,并且由于某种原因它并不总是涵盖所有符合条件的单元格。

SELECT serial.* 
FROM serial as serial 
INNER JOIN (SELECT id, MAX(season) AS maxseason, MAX(seria) AS maxseria FROM serial GROUP BY news_id) as one_serial 
ON serial.id = one_serial.id 
WHERE serial.season = one_serial.maxseason AND serial.seria = one_serial.maxseria 
ORDER BY serial.date_update 

请帮忙。谢谢。

【问题讨论】:

  • 假设你有两条记录作为 news_id。一个有第 1 季和第 2 季。另一个有第 2 季和第 1 季。所以最大季为 2,最大季为 2。但没有第 2 季和第 2 季的记录。所以你不想显示任何结果行对于这个 news_id?
  • 哦,我明白了这个问题,谢谢。让你帮忙写sql请求?也许你知道比我想象的更好的选择

标签: mysql max sql-order-by where


【解决方案1】:

规范不清楚。

但我们确实知道 GROUP BY news_id 子句会将所有具有共同值 news_id 的行合并为一行。 (其他数据库使用这种语法会抛出错误;如果我们在 sql_mode 中包含 ONLY_FULL_GROUP_BY,我们可以让 MySQL 抛出类似的错误。)

我的建议是从查询末尾删除 GROUP BY news_id 子句。

但这只是猜测。完全不清楚您要达到的目标。

编辑

 SELECT t.* 
   FROM ( 
          SELECT r.news_id
               , r.season
               , r.seria
               , MAX(r.date_update) AS max_date_update
            FROM ( 
                   SELECT p.news_id
                        , p.season
                        , MAX(p.seria) AS max_seria
                     FROM ( 
                            SELECT n.news_id
                                 , MAX(n.season) AS max_season
                              FROM serial n 
                             GROUP BY n.news_id
                          ) o
                     JOIN serial p
                       ON p.news_id = o.news_id
                      AND p.season  = o.max_season
                 ) q
            JOIN serial r
              ON r.news_id = q.news_id
             AND r.season  = q.season
             AND r.seria   = q.max_seria
         ) s
    JOIN serial t      
      ON t.news_id     = s.news_id
     AND t.season      = s.season
     AND t.seria       = s.seria
     AND t.date_update = s.max_date_update
   GROUP BY t.news_id
   ORDER BY t.news_id 

或者,使用 MySQL 用户定义变量的替代方法...

 SELECT s.id
      , s.season
      , s.seria
      , s.date_update 
   FROM ( 
          SELECT IF(q.news_id = @p_news_id,0,1) AS is_max
               , q.id
               , @p_news_id := q.news_id AS news_id
               , q.season
               , q.seria
               , q.date_update
            FROM ( SELECT @p_news_id := NULL ) r
           CROSS
            JOIN serial q
           ORDER
              BY q.news_id     DESC
               , q.season      DESC
               , q.seria       DESC
               , q.date_update DESC
        ) s
  WHERE s.is_max
  ORDER BY s.news_id

【讨论】:

  • 我需要按 date_update DESC 和所有这些 GROUP BY news_id 排序的最高季节和序列的所有单元格(即不要重复 news_id 的值)。如果我删除 GROUP BY,每个 news_id 都会让我获得所有行
  • @SakurasouCat:考虑提供示例数据预期结果以阐明规范。因为您的描述非常不清楚,让我们猜测您要达到的目标。
  • 我有下一个数据 - prnt.sc/few90a 并且我需要得到下一个结果 prnt.sc/few8js 因为这一行具有最高的季节和序列以及每个新闻 ID 的日期更新。即我需要选择具有最高季节和序列的数据以及按 news_id 分组的 date_update 并按 date_update DESC 排序
  • 请提供附加信息作为对原始问题编辑,而不是作为对答案的评论。 (请注意,图片是一种提供示例数据和预期结果的懒惰可怕方式。)
  • 谢谢!替代选择工作出色!第一次查询不返回数据,结果为空。谢谢!
【解决方案2】:

子查询根据news_id 选择最大season 和最大serianews_id 有多少记录同时匹配最大 season 和最大 seria 我们不知道。可以是一、二、千或零。

因此,通过加入,您将获得每个 news_id 的未知数量的记录。然后按news_id 分组。这将为每个 news_id 提供一个结果行。那么如何选择serial.** 表示一行中的所有列,但是哪一行,什么时候news_id 可以有很多列? MySQL 通常在这种情况下任意选择值(通常都来自同一行,但即使这样也不能保证)。因此,您最终会得到由date_update 订购的随机行。

这没有多大意义。所以问题是:你真正想要实现什么?也许我的解释就足够了,您现在可以自己修复查询了。

【讨论】:

  • 征求意见,你解释得很好,但我没有足够的知识来自己修复它。
  • 而且我不知道您要达到的目标。编辑您的请求,说明您想要做什么,显示一些示例数据和预期结果,以便我们了解您的需求。
  • 好的,我明白了。我做了这样的事情SELECT serial.* FROM serial as serial INNER JOIN (SELECT id, MAX(season) AS maxseason, MAX(seria) AS maxseria FROM serial GROUP BY news_id) as one_serial ON serial.id = one_serial.id WHERE serial.season = one_serial.maxseason AND serial.seria = one_serial.maxseria ORDER BY serial.date_update DESC 但返回的数据不正确prnt.sc/fev7b6 我有大数据的行而不是 id 1 的行对于 news_id 4
  • 我需要获取所有按 date_update DESC 和所有这些 GROUP BY news_id 排序的最高季节和序列的单元格(即不要重复 news_id 的值)
  • 您是否希望每个 news_id 恰好有一个结果行?如果你这样做,那么当有几个具有最高季节和序列的行时,你想显示哪一行?
猜你喜欢
  • 2016-12-30
  • 1970-01-01
  • 2016-12-28
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2016-02-16
相关资源
最近更新 更多