- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取在一个特定列(“版本”)中具有最高值的记录。我正在使用 base_id 获取行,并且可能有不止一行具有相同的 base_id,但它们将具有不同的版本号。所以声明的重点是只获取版本最高的那个。下面的语句有效,但前提是实际上有多个值。如果只有一个,我根本得不到任何记录(与预期的一行相反)。那么,即使某些记录只存在一个版本,我如何才能只获得下面版本号最高的值?:
SELECT r.id
, r.title
, u.name created_by
, m.name modified_by
, r.version
, r.version_displayname
, r.informationtype
, r.filetype
, r.base_id
, r.resource_id
, r.created
, r.modified
, GROUP_CONCAT( CONCAT(CAST(c.id as CHAR),',',c.name,',',c.value) separator ';') categories
FROM resource r
JOIN category_resource cr
ON r.id = cr.resource_id
JOIN category c
ON cr.category_id = c.id
JOIN user u
ON r.created_by = u.id
JOIN user m
ON r.modified_by = m.id
WHERE r.base_id = 'uuid_033a7198-a213-11e3-93de-2b47e5a489c2'
AND r.version = (SELECT MAX(r.version) FROM resource r)
GROUP
BY r.id;
编辑:
我意识到查询本身的其他部分可能会使事情复杂化,所以我将尝试创建一个更清晰的示例,我希望它应该能显示我所追求的内容。
如果我这样做:
SELECT id, title, MAX(version) AS 'version' FROM resource GROUP BY title
在看起来像这样的 table 上:
然后我得到以下结果:
从表中可以看出,这是不正确的。也就是说,它为每个资源获取了最高值,但是如果您查看简介,例如版本值为 2 的资源的 ID 为 6,而获取的资源的 ID 为 1。所以查询似乎以某种方式组合了来自不同行的值...?
我应该指出,我是 SQL 的新手,我用来举例说明问题的原始查询是我在这里得到的帮助,所以请尽可能清楚地解释,谢谢。
另一个注意事项是我发现了一些关于子查询的建议,但除了没有返回正确的结果之外,它真的很慢。我正在对 5000 行进行测试,我真的希望它只需要几分之一秒才能满足性能要求。
编辑 2:
找到了一种合并声明的方法,有点像建议的方法之一,以及此处的各种解决方案:Retrieving the last record in each group
但是,我尝试了所有这些方法,尽管大多数看起来都有效,但它们非常慢……
拿这个:
SELECT
r.id, r.title,
u.name AS 'created_by', m.name AS 'modified_by', r.version, r.version_displayname, r.informationtype,
r.filetype, r.base_id, r.resource_id, r.created, r.modified,
GROUP_CONCAT( CONCAT(CAST(c.id as CHAR),',',c.name,',',c.value) separator ';') AS 'Categories'
FROM
resource r
INNER JOIN
(SELECT
DISTINCT r.id AS id
FROM
resource r
INNER JOIN
category_resource cr1 ON (r.id = cr1.resource_id)
WHERE
cr1.category_id IN (9)
) mr
ON r.id = mr.id
INNER JOIN category_resource cr
ON r.id = cr.resource_id
INNER JOIN category c
ON cr.category_id = c.id
INNER JOIN user u
ON r.created_by = u.id
INNER JOIN user m
ON r.modified_by = m.id
INNER JOIN
(
SELECT max(version) MyVersion, base_id
FROM resource
GROUP BY base_id
) r2
ON r.base_id = r2.base_id
AND r.version = r2.MyVersion
group by r.base_id
order by r.version desc;
在末尾添加(从 INNER JOIN 开始)以仅获取每个 base_id 具有最高版本值的行,这将查询从 20 毫秒减慢到大约 6-8 秒。那是不行的……但这让我感到惊讶。虽然我显然不是数据库专家,但在我看来应该优化数据库查询以获取这样的数据。但是如果我做我能想到的唯一选择,那就是获取所有记录而不考虑版本号,然后在 PHP 中过滤它们,你猜怎么着?那比这快多了……
我最初认为 PHP 中的过滤对性能造成的影响太大了,但那是大约一秒钟的延迟,所以还是比这好得多。
但我觉得我错过了什么,难道不应该更有效地做到这一点吗?
最佳答案
鉴于您自己的回答,您的问题与您提供的链接中的问题基本相同。由于您有一些子问题,我会尝试在那里为您提供一些额外的帮助。
如果您想在您的数据库中进行某种版本控制,那么您基本上可以通过一些版本列来扩展您的主键。出于您提到的原因,我也会投票赞成使用开始日期/结束日期列。鉴于您自己的答案,您可以相应地修改您的布局。如果可以的话,那是你应该走的路!
在您给出的示例中,不清楚主键是什么,因为“id”列也有变化的值。在您的情况下,主键将是“标题”列。所以你可以使用像
这样的查询SELECT title, max(version) as version FROM resource GROUP BY title
获得一个结果,您可以在其中看到您的原始主键和最新版本——它们共同构成了您的实际主键。
要获取该表中的所有其他字段,您需要将该结果连接到资源表并将主键字段用作连接条件。
SELECT * FROM (
SELECT title, max(version) as version
FROM resource
GROUP BY title) as s
INNER JOIN resource r on (r.title = s.title AND r.version = s.version)
为什么您的查询给您错误的结果?
原因是,您的查询中有一个错误,MySQL 已为您“修复”。通常,您需要在 GROUP BY 子句中提供未在聚合函数(如 MAX())中使用的每一列。在你的例子中
SELECT id, title, MAX(version) AS 'version' FROM resource GROUP BY title
您在查询的选择部分中有一个列('id'),您没有在 GROUP BY 子句中提供。
在 MySQL 中,您可以忽略该规则 (see here)。
When using this feature, all rows in each group should have the same values for the columns that are ommitted from the GROUP BY part. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.
由于“id”列对您的键(“title”列)有不同的值,您只是得到了一些结果——在这种情况下,MySQL 可能只是使用它找到的第一行。但结果本身是未定义的,可能会发生变化,例如当数据库更新或数据增长时。您不应该依赖于从测试时看到的结果中推断出的规则!
在 oracle 和 SQL-Server 等其他数据库上,您会在尝试执行最后一个查询时遇到错误。
我希望我能稍微澄清一下你的结果的原因。
关于mysql - 一列中的 SQL 最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135526/
我有一个像 [3,10,4,3,9,15,6,13] 这样的列表,我想找到两个不重叠的系列/序列给出通过取最大-最小值可获得的最大值.它们必须是连续的,因此您不能从 1 中减去项目 3。但是您可以从
我正在尝试创建顶部列,这是几个列行的最大值。 Pandas 有一个方法 nlargest但我无法让它成行工作。 Pandas 也有 max和 idxmax这正是我想做的,但仅限于绝对最大值。 df =
我在使用 Android 时遇到了一点问题。 我有我的 GPS 位置,明确的经纬度,以及以米为单位的搜索射线(例如 100 米),可以吗? 想象一下我在射线形成的圆心的位置,我会知道如何在 Andro
假设我有一组最小值和最大值。我想要一个数据结构,在给定外部值的情况下,它会最有效地为我提供值 >= 最小值、值 = 最小值和值 <= 最大值?,我们在Stack Overflow上找到一个类似的问题:
我有以下 Maxima 代码: m:sum(x[i],i,1,N)/N; 然后我想计算 $m^2$。 m2:m^2, sumexpand; 然后我得到双重求和: sum(sum(x[i1]*x[i2]
如何从嵌套字典中获取一个值的最小值/最大值,该字典的缺失值也包含“Nan”? *这是供引用,我找到了一个解决方案,我想我应该在这里分享它,因为我在 stackoverflow 上的任何地方都找不到答案
在千里马 12.04.0 我有一个总和 mysum : sum(u[i]^2, i, 1, N); 现在我区分它 diff(mysum, u[i]); 现在我指定一个定义的索引 i=A 来区分它 at
是否可以根据时间轴获取最小和最大时间戳?我将在 parking 场示例中进行解释。 +---------------------+------+--------+-------+-----------
基本上在几个领域有几个日期 SELECT MAX(MAX(DATE_A),MAX(DATE_B)) from table DATE_A 和 DATE_B 是日期,我基本上想要日期 A 或日期 B 的最
我创建了一个小测试,其中一个 div 根据滚动深度滑动。 我只是想知道怎么设置 A) 起点 (scrolltop = x something) B) 如何设置最大值? var pxlCount = 0
由于达到最大值,clock_gettime() 何时会使用 CLOCK_MONOTONIC 返回一个较小的值?我不是指被描述为错误的小扭曲,而是类似于计数器重置的东西。 它是时间测量的,还是与滴答的绝
我正在使用 angularjs,尤其是 $timeout 服务(setTimeout 的包装器)。它的工作原理如下: angular.module('MyApp').controller('MyCo
是否有可能获得 MinValue - 或 MaxValue未知的 T 型?如 Int其中有 Int.MinValue和 Int.MaxValue ?? 谢谢 最佳答案 正如@mpilquist 在上面
我的数据为 员工: id Name -------- 1 xyz 2 abc 3 qaz Employee_A:(Eid - 员工表,title - 职称表) eid active
我有一个日期和时间行列表,每天有多行。 对于每个唯一日期,我想获取最小和最大时间值。 如何在 Excel v10(又名 2002)中执行此操作? 最佳答案 首先,您可以使用 Excel 函数 MIN(
我有以下 SQL 表 - Date StoreNo Sales 23/4 34 4323.00 23/4 23 5
我可能错过了一些微不足道的东西。我想我还没有完全理解一些基本的交叉过滤器概念 无论如何,我创建了一个带有几个维度的交叉过滤器,并在维度上使用过滤器。我现在想知道过滤值(不是键)的最小值/最大值。 我将
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我在这里错过了什么吗?我希望以下代码段中的 np.max 会返回 [0, 4] ... >>> a array([[1, 2], [0, 4]]) >>> np.max(a,
给定大小为 2 的列表列表,我试图找到通过索引确定最小/最大值的最快方法。目标是确定一系列 XY 点的边界/范围。 子列表未排序(按一个索引排序并不能保证另一个索引已排序)。 目前我正在做以下事情:
我是一名优秀的程序员,十分优秀!