我是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
)
请想象大量的数据。获得最大值的最佳方法是什么?
我想你的问题是:最近发现了哪种气态元素
您的示例解决方案是正确的。
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可以使用松散索引扫描来满足此查询,这非常有效。
DiscoverYear
上的索引可以使外部查询更快。
ALTER TABLE discoveries ADD INDEX state_year (DiscoverYear)
有些人可能建议在CCD_ 6上建立一个复合指数。但是,在您的问题中,外部查询只查找一个或极少数项目。
阅读本文,了解解决此类问题的多种方法。http://use-the-index-luke/需要避免的一件事是:在表上放置大量索引,以备不时之需。