1

我是 MySQL 的新手。我在 Stack Overflow 找到了几个想法和代码来获得指定的最大值。所有这些都是完全不同的,我无法决定哪个是最好的方法。我不能使用GREATESTor 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
)

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

4

1 回答 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 可以使用非常有效的松散索引扫描来满足此查询。

外部查询可以通过DiscoverYear.

ALTER TABLE discoveries ADD INDEX state_year (DiscoverYear)

有些人可能会建议在(DiscoverYear, ElementName). 但是,在您的问题中,您的外部查询仅查找一个或很少几个项目。

阅读本文以了解解决此类问题的许多方法。http://use-the-index-luke/ 要避免的一件事:在表上放置大量索引以防万一。

于 2017-02-12T14:47:51.787 回答