MySQL - 在没有 LIMIT 或 JOIN 的情况下选择指定搜索的最大值

标签 mysql max minimum maxima minima

我是 MySQL 的新手。我在 Stack Overflow 上找到了几个想法和代码来获得指定的最大值。他们都是完全不同的,我不能决定哪一个是最好的方法。我不能使用 GREATESTLEAST,因为我知道它不适用于具有 PK 和/或具有 FK 的多个表。 (在我的期末考试中,我也必须使用 FK 和 PK。)

这是我自己的代码:

SELECT Column
FROM table
WHERE Column =
(
    SELECT MAX(Column)
    FROM table
    WHERE Value = true
)

我找到了一个懒惰的版本来获取最大值:

SELECT ColumnName
FROM table
WHERE Value = true
ORDER BY ColumnName DESC
LIMIT 1

据我所知,这首先会下订单,这比检查所有数据一次并获得最小值要花更多的时间。

我还发现了这个使用 JOIN 的类似句子的方法:

select
 f.*
from
 foo f
inner join
(
 select min(id) as id from foo
) m on m.id = f.id;

但现在我没有多个表,我认为我不必因为一个表的一个查询而创建一个(临时的?)子表。


这是我的任务:查询最后发现的物质的气态。

我只有 1 个表的列数据:http://pastebin.com/raw/82zZ0rh2

如果元素是气态物质,则 Gas 列的行值为 1,否则为 0。

我的示例代码是这样处理的:

SELECT DiscoverYear, ElementName
FROM discoveries
WHERE DiscoverYear =
(
    SELECT MAX(DiscoverYear)
    FROM discoveries
    WHERE Gas = 1
)

请想象大量的数据。获得最大 yield 的最佳方式是什么?

最佳答案

我认为您的问题是:最近发现了哪种气态元素?

您的示例解决方案是正确的。

SELECT DiscoverYear, ElementName
FROM discoveries
WHERE DiscoverYear =
(
    SELECT MAX(DiscoverYear)
    FROM discoveries
    WHERE Gas = 1
)

如果碰巧在同一年发现了两个元素,那么您将同时获得这两个元素,这是一个合理的结果。

您需要 SQL 索引才能处理大量数据。请注意,元素周期表中的元素数量是一个非常小的数据集,不值得您花时间进行优化。

内部查询 SELECT MAX(DiscoverYear) FROM discoveries WHERE Gas = 1 可以通过 (Gas, DiscoverYear) 上的复合索引进行优化。您可以使用此命令创建它。

ALTER TABLE discoveries ADD INDEX state_year (Gas, DiscoverYear)

MySQL 可以使用 loose index scan which is very efficient 满足此查询.

DiscoverYear 上的索引可以使外部查询更快。

ALTER TABLE discoveries ADD INDEX state_year (DiscoverYear)

有些人可能建议在 (DiscoverYear, ElementName) 上使用复合索引。但是,在您的问题中,您的外部查询仅查找一项或极少数项目。

阅读本文了解解决此类问题的多种方法。 http://use-the-index-luke/要避免的一件事是:在您的表上放置大量索引以备不时之需。

关于MySQL - 在没有 LIMIT 或 JOIN 的情况下选择指定搜索的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188592/

相关文章:

sql - 在结果集中查找最近的日期

mysql - 合并同一个表sql中的行

MySQL:我检索了按部门排序的最高工资列表。如何找到这些最高工资中的最低工资?

Python MySQL Update 需要 10-12 秒更新约 1000 条记录

mysql - 基于日期类型 mysql 列的年份添加唯一子句

sql - 特定 id 的最大日期返回值

r - 向量的最小和最大连续值

java - 在 Java 中使用 Double.POSITIVE_INFINITY 寻找最小值

php - 在 PHP 脚本中的 MySQL 查询期间删除文本列中的回车符

javascript - (My)SQL 上的正则表达式创建语句