2017-02-12 17 views
0

Я очень новичок в MySQL. Я нашел несколько идей и кодов здесь, в Stack Overflow, чтобы получить указанное максимальное значение. Все они были совершенно разными, и я не могу решить, какой из них лучший. Я не могу использовать GREATEST или LEAST, так как я знаю, что он не работает с ПК и/или имеет несколько таблиц FK. (На мой последний экзамен, я должен использовать FK и PK тоже.)MySQL - выберите максимальное значение указанного запроса без LIMIT или JOIN

Вот мой собственный код:

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

Все методы вполне разумны с правильной структурой индексации. –

ответ

0

Я думаю, что ваш вопрос таков: Какой газообразный элемент был обнаружен совсем недавно?

Ваш пример решения верен.

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/ Одна вещь, которую следует избегать: ставить множество индексов на свои столы на всякий случай, если они вам понадобятся.

+0

Спасибо за ваш быстрый ответ. Я не думал больше о результатах в том же году, я даже не знал, что это в моем решении. Вы объяснили все, а также хорошие ссылки для улучшения моих и других знаний. Это важно для меня, потому что я должен сделать устный выпускной экзамен тоже. Еще раз спасибо! – Charusso

+0

Добро пожаловать. У меня есть мягкое пятно в моем сердце для химиков, изучающих вычисления; Я был один раз. –

 Смежные вопросы

  • Нет связанных вопросов^_^