2016-12-02 90 views
0

我试图获取组中的最高版本。我查询:SQL:Group By不匹配记录

SELECT 
    rubric_id, 
    max(version) as version, 
    group_id 
FROM  
    rubrics 
WHERE 
    client_id = 1 
GROUP BY 
    group_id 

数据:

enter image description here

结果:

enter image description here

ID 2的栏目没有一个版本的2 ,为什么这是不匹配?我需要做些什么来纠正这个问题?

编辑,不是重复:

这不是SQL Select only rows with Max Value on a Column重复,这是我写这之前已经阅读并引用的文章。我的问题是不是如何找到最大,我的问题是为什么是version不匹配正确的ID

+0

[SQL选择只在色谱柱的最高值的行(可能的重复http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on- a-column) –

+0

@ PM77-1我实际上是参考那篇文章来指导如何完成我的目标。但是,这篇文章并不关于如何选择列的最大值。这是关于为什么版本似乎不匹配,这是我明确要求的。 –

+0

你需要Google'MySQL GROUP BY Extensions'并仔细阅读。你会明白,“* mismatch *”的原因并解决它,你将需要使用我引用的帖子中的技术。 –

回答

2

MySQL令你感到困惑,因为让你不必在列表中选择一个不在你的组中的列。要解决此问题,请确保您未选择任何不在组中的字段。

而不是试图在一个语句中获取所有内容,您将需要使用子查询来查找max_version_id,然后加入到它。

SELECT T.* 
FROM rubrics T 
JOIN 
(
    SELECT 
     group_id, 
     max(version) as max_version 
    FROM  
     rubrics 
    GROUP BY 
     group_id 
) dedupe 
on T.group_id = dedupe.group_id 
and T.version_id = dedupe.max_version_id 
WHERE 
    T.client_id = 1 
+0

谢谢你的建设性和有益的解释。我意识到我对Group By的功能有一个基本的误解。我正在尝试类似于您在那里的内容,但我在内部查询中包含了第三个字段。所以我只关注我的问题中内部查询的结果。 –

+0

我很高兴这是有帮助的。谢谢! – aaronsteers

-1

编辑:So MySQL allows it, but I don't think it's a good practise to use it

您正试图从聚合查询中查询非聚合数据。你不应该那样做。

一个GROUP BY需要的领域,应该让行组(在你的情况,你与你的GROUP BY说的是:给我每个不同group_id结果),并给出了基于分组的结果(汇总数据) 。

在这里,您尝试访问非聚合数据(在您的情况下为rubric_id)。出于某种原因,查询不会崩溃,并在您的聚合数据中选择一个“随机”ID。

+0

MySQL允许。阅读https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html –

+0

我不知道,但为什么它被允许? –

+0

http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-c​​onflicts-with-sql-standards –