MySQL - 选择指定搜索的最大值,无需 LIMIT 或 JOIN
MySQL - Choose specified search's maximum value without LIMIT or JOIN
我是 MySQL 的新手。我在 Stack Overflow 上找到了几个想法和代码来获得指定的最大值。他们都是完全不同的,我不能决定哪一个是最好的方法。我不能使用 GREATEST
或 LEAST
,因为我知道它不适用于具有 PK and/or 具有 FK 多个 table。 (在我的期末考试中,我也必须使用 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;
但现在我没有多个 table,而且我认为我不必(临时的?)子 table 因为来自一个 [=47] 的一个查询=].
我的任务是:查询最后发现的是哪种气态物质。
我唯一的 1 table 的数据包含以下列: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 个索引才能处理大量数据。请注意,周期性 table 中的元素数量是一个 非常小的 数据集,不值得您花时间进行优化。
内部查询 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/ 需要避免的一件事是:在 table 上放置大量索引以备不时之需。
我是 MySQL 的新手。我在 Stack Overflow 上找到了几个想法和代码来获得指定的最大值。他们都是完全不同的,我不能决定哪一个是最好的方法。我不能使用 GREATEST
或 LEAST
,因为我知道它不适用于具有 PK and/or 具有 FK 多个 table。 (在我的期末考试中,我也必须使用 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;
但现在我没有多个 table,而且我认为我不必(临时的?)子 table 因为来自一个 [=47] 的一个查询=].
我的任务是:查询最后发现的是哪种气态物质。
我唯一的 1 table 的数据包含以下列: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 个索引才能处理大量数据。请注意,周期性 table 中的元素数量是一个 非常小的 数据集,不值得您花时间进行优化。
内部查询 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/ 需要避免的一件事是:在 table 上放置大量索引以备不时之需。