求助,请让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
请帮忙。谢谢。
规格不清楚。
但我们确实知道
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
子查询选择最大
season
和每个seria
的最大news_id
。我们不知道有多少条记录与最大 news_id
和最大 season
都匹配。它可以是一、二、千或零。因此,通过连接,每个
seria
都会获得未知数量的记录。然后按
news_id
进行分组。这将为您提供每个 news_id
一个结果行。那么如何选择news_id
呢? serial.*
表示一行中的所有列,但是当 *
可以有很多列时,是哪一行呢?在这种情况下,MySQL 通常会任意选择值(通常全部来自同一行,但即使如此也不能保证)。因此,您最终会得到随机行,并按 news_id
排序。这没有多大意义。所以问题是:你真正想要实现什么?也许我的解释已经足够了,您现在可以自己解决您的查询了。