2013-02-28 2 views
1

У меня есть этот запрос, который должен вернуть некоторую информацию, такую ​​как цена, открыть, закрыть и т. Д. Для последней записи.mysql max (date) не работает

SELECT * FROM History WHERE symbol = $symbol Having max(`date`); 

Но по какой-либо причине он не возвращает правильную информацию. Это почему-то считает, что максимальная дата - 2013-02-14, но если я посмотрю на все данные, то самое последнее на самом деле - 2013-02-27. в данном конкретном случае

$symbol = "AGNC" 

ли максимальная функция не работает на сегодняшний день?

+0

Какова структура таблицы истории? каково имя столбца даты? –

ответ

7

Я думаю, вы хотите иметь что-то вроде этого. Я не болею за это, используя предложение ORDER BY, потому что есть некоторые возможности (, хотя очень мало), что записи могут иметь одинаковую последнюю запись date.

SELECT * 
FROM History 
WHERE symbol = $symbol AND 
     date = (SELECT MAX(date) FROM History) 
+0

Ну, это сработало. Но я не понимаю. Почему/как это отличается? – brandenwagner

+0

@brandenwagner Что вы подразумеваете под * Почему/Как это отличается? *? –

+0

Почему это показывает правильную дату, но мой оригинальный запрос не делает? – brandenwagner

2

Мое предложение было бы не использовать MAX вообще; если то, что вы хотите сделать, это только выборку последней записи в таблице, вы можете попробовать:

SELECT * FROM History WHERE symbol = $symbol ORDER BY date DESC LIMIT 1;

Это отлично работает до тех пор, как ваше date поля фактически объявлено как дата, связанные с типом поля MySQL, как date, datetime и т.д.

Как JW отметил в своем ответе, вы можете добавить дополнительные поля в вашем ORDER BY заявления неоднозначности записи, которые имеют ту же самую дату.

Кроме того, вы можете поместить символ $ в кавычках, если это поле строка (char, varchar и т.д.):

SELECT * FROM History WHERE symbol = '$symbol' ORDER BY date DESC LIMIT 1;

Ура!

+0

, и это не будет обрабатывать дубликаты правильно? Например, http://www.sqlfiddle.com/#!2/d65b8/2 –

+0

Часть LIMIT 1 гарантирует возврат только одной записи, если это то, что вы имеете в виду; если несколько строк имеют одну и ту же дату, он выберет один из них и вернет его. Кого он выбирает, будет зависеть от дополнительных полей ORDER BY (если ничего не указано, возвращенная запись не может быть гарантирована тем, что вы ищете). Тем не менее, я считаю, что это более эффективный подход, поскольку он не полагайтесь на запуск подзапроса и функцию MySQL ... –

+1

Уточнение моего последнего комментария - автор вопроса заявил, что ему нужна только последняя запись (а не записи). Предполагая, что он хочет только одну запись, мое утверждение делает трюк с большей эффективностью, поскольку для этого не требуется подзапрос. Однако, если автору нужны все-записи, опубликованные в максимальную дату, то ваш отчет действительно лучший вариант. Приветствия JW! –

0

Следующие должны делать то, что вы хотите:

SELECT * 
FROM History h 
WHERE symbol = $symbol and 
     `date` = (select max(`date`) from History where symbol = $symbol) 
0

вы можете использовать псевдоним имя таблицы SELECT * FROM История WHERE символ = $ символ и дата = (SELECT MAX (дата) из истории)

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