MySQL - 在没有 LIMIT 或 JOIN 的情况下选择指定搜索的最大值
Posted
技术标签:
【中文标题】MySQL - 在没有 LIMIT 或 JOIN 的情况下选择指定搜索的最大值【英文标题】:MySQL - Choose specified search's maximum value without LIMIT or JOIN 【发布时间】:2017-06-30 12:37:07 【问题描述】:我是 mysql 的新手。我在 Stack Overflow 找到了几个想法和代码来获得指定的最大值。所有这些都是完全不同的,我无法决定哪个是最好的方法。我不能使用GREATEST
或LEAST
,因为我知道它不适用于具有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
如果元素是物质的气体状态,则气体列的行值为 1,否则为 0。
我的示例代码是这样处理的:
SELECT DiscoverYear, ElementName
FROM discoveries
WHERE DiscoverYear =
(
SELECT MAX(DiscoverYear)
FROM discoveries
WHERE Gas = 1
)
请想象大量数据。获得最大值的最佳方法是什么?
【问题讨论】:
所有方法都相当合理,索引结构正确。 【参考方案1】:我认为您的问题是:最近发现了哪种气体元素?
您的示例解决方案是正确的。
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 的情况下选择指定搜索的最大值的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 优化查询(LIMIT、OFFSET、JOIN)> 2500 万行
LIMIT 1 inside JOIN 来自 MySQL 中的特定表?
MySQL SELECT JOIN LIMIT row Comment per Post 和 LIMIT row Post per User