选择最大 MySQL 的位置

问题描述 投票:0回答:2

求助,请让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 分组的日期更新,并按日期更新 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 

请帮忙。谢谢。

mysql max sql-order-by where-clause
2个回答
1
投票

规格不清楚。

但我们确实知道

GROUP BY news_id
子句会将所有具有共同值
news_id
的行折叠成一行。 (其他数据库会用这种语法抛出错误;如果我们在
ONLY_FULL_GROUP_BY
中包含
sql_mode
,我们可以让 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

0
投票

子查询选择最大

season
和每个
seria
的最大
news_id
。我们不知道有多少条记录与最大
news_id
和最大
season
都匹配。它可以是一、二、千或零。

因此,通过连接,每个

seria

都会获得未知数量的记录。然后按

news_id
进行分组。这将为您提供每个
news_id
一个结果行。那么如何选择
news_id
呢?
serial.*
表示一行中的所有列,但是当
*
可以有很多列时,是哪一行呢?在这种情况下,MySQL 通常会任意选择值(通常全部来自同一行,但即使如此也不能保证)。因此,您最终会得到随机行,并按
news_id
排序。

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

© www.soinside.com 2019 - 2024. All rights reserved.