sql查询以获取与另一列的最大值相对应的列值?

问题描述 投票:0回答:3
,这是我的查询:

SELECT video_category, video_url, video_date, video_title, short_description, MAX(video_id) FROM videos GROUP BY video_category
当它拉出数据时,我会为video_id获得正确的行,但是它为其他类别的第一行拉了第一行。因此,当我获得类别1的Video_ID的最大结果时,我获得了最大ID,但是表格中的第一行,日期,标题和描述。

如何将其拉动与最大ID结果相对应的其他列?

Edit:固定

SELECT * FROM videos WHERE video_id IN ( SELECT DISTINCT MAX(video_id) FROM videos GROUP BY video_category ) ORDER BY video_category ASC

我会尝试这样的事情:
SELECT
   s.video_id
   ,s.video_category
   ,s.video_url
   ,s.video_date
   ,s.video_title
   ,s.short_description
FROM videos s
   JOIN (SELECT MAX(video_id) AS id FROM videos GROUP BY video_category) max
      ON s.video_id = max.id
mysql sql group-by max aggregate-functions
3个回答
82
投票
比您自己的解决方案快得多

我最近发明了一种新技术来模拟MySQL中的窗口功能。我称其为标量 - 聚集减少。
迄今为止,这是实现此目的的最高绩效方法和最简单的方法(用DB发动机术语),因为它不需要连接,不需要连接,也没有CTE。
对于您的查询,它看起来像这样:

SELECT video_category, MAX(video_id) AS video_id, SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS video_url, SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_date)), 12) AS video_date, SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_title)), 12) AS video_title, SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), short_description)), 12) AS short_description FROM videos GROUP BY video_category

44
投票
标量和聚合函数的组合可以完成以下操作:

lpads内部相关的标识符以允许正确的字符串比较(例如“ 0009”和“ 0025”,将适当排名)。 我在这里假设一个int主键,我要在这里使用11个字符。 如果您使用bigint,则需要增加它以支持桌子的法令。 如果您要在DateTime字段(固定长度)上进行比较,则无需填充。

将带填充的标识符与输出列结合在一起(因此您将获得“ 00000000009MyValue” vs“ 0000000025 hothervalue”)

MAX总套件,将产生“ 00000000025渗透价”作为获胜者。
结果,结果将截断比较的标识符部分,仅留下值。

如果您想在char以外的其他类型中检索值,则可能需要对输出进行额外的铸件,例如如果您想成为日期时间:

  1. video_date
  2. 此方法对自我键入方法的好处是,您可以组合其他汇总数据(不仅是最新值),甚至可以在同一查询中组合第一个和最后一项,例如
  3. CAST(SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_date)), 12) AS DATETIME)
  4. 有关说明这种方法与其他较旧方法的好处的更多详细信息,我的完整博客文章在此处:
  5. https://www.stevenmoseley.com/blog/tech/tech/high-performance-sql-collelated-sql-calrelated-scalar-scalar-scalar-scalar-aggregate-reduction -queries

稍微“质朴”的解决方案,但应该做同样的工作:

SELECT -- Overall totals video_category, COUNT(1) AS videos_in_category, DATEDIFF(MAX(video_date), MIN(video_date)) AS timespan, -- Last video details MAX(video_id) AS last_video_id, SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS last_video_url, ... -- First video details MIN(video_id) AS first_video_id, SUBSTRING(MIN(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS first_video_url, ... -- And so on

其他单词,只需制作一个带有您想要的所有列的表格,对其进行排序,以使最大值在顶部,然后将其切碎,以便您只返回一行。
    

HERRE是一种更通用的解决方案(处理重复)
SELECT
  video_category,
  video_url,
  video_date,
  video_title,
  short_description,
  video_id
FROM
  videos
ORDER BY video_id DESC
LIMIT 1;

选择video_category,video_url,video_date,video_title,short_description,video_id 来自视频T1 where video_id in(从视频中选择max(video_id)t2中的t1.video_category = t2.video_category);

11
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.