- 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/
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!