MySQL запрос на возврат последней записи для каждой таблицы - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть mySQl db (название «акции») с 50 таблицами, каждая из которых имеет

идентификатор, символ, дату, время, открытие, максимум, минимум, закрытие, объем в виде столбцов (9 столбцов).

Я хотел бы знать, какая последняя запись для каждой таблицы упорядочена по дате и времени.

Должен ли я заказать все данные для каждой таблицы или есть лучший способпросто знать последнюю запись?

Я прошу помощи для запроса, который просто возвращает только последнюю запись для каждой таблицы в дБ.

Спасибо

PS Для последней записи я имею в видусамый последний как Дата тогда Время

Ответы [ 3 ]

9 голосов
/ 02 февраля 2012

Есть два варианта, как это сделать:

-- I would use this only if you need more than one records
SELECT * FROM table ORDER BY date DESC LIMIT 1;

-- Way to go:
SELECT * FROM table WHERE date = (SELECT MAX(date) FROM table) LIMIT 1;

Не забудьте добавить индекс на date. Если возможно, вы добавите много записей одновременно, вам нужно будет добавить:

ORDER BY id DESC -- In case that date is highest for records for last records
ORDER BY time DESC -- Every other case

до конца запроса

7 голосов
/ 02 февраля 2012

Я собираюсь сделать предположение, что запись с наибольшим идентификатором является «последней» (при условии строгого увеличения последовательных идентификаторов, которые уникальны в таблице).Если у вас есть лучшее определение «последний», которое может иметь значение.

Чтобы получить одну «последнюю» запись, вы можете сделать:

Select * from table_1 where id = (select max(id) from table_1);

Чтобы получить результаты всех 50таблиц в один набор результатов, вы можете сделать:

Select * from table_1 where id = (select max(id) from table_1)
union
Select * from table_2 where id = (select max(id) from table_2)
union
Select * from table_3 where id = (select max(id) from table_3)
union...

MySQL-решение может быть

Select * from table_1 order by id desc limit 1
union
Select * from table_2 order by id desc limit 1
union
Select * from table_3 order by id desc limit 1
union...

На основе вашего редактирования (где вы на самом делеопределите, что вы подразумеваете под «последним»):

Select * from table_1 order by date desc, time desc, id desc limit 1
union
Select * from table_2 order by date desc, time desc, id desc limit 1
union
Select * from table_3 order by date desc, time desc, id desc limit 1
union...
0 голосов
/ 02 февраля 2012

Вот один из способов сделать это без сортировки таблицы:

select * from tab1
 where time = (select max(time)
                 from tab1
                where date = (select max(date) from tab1))
   and date = (select max(date) from tab1)

Это должно быть очень быстро, например, O (c), при условии, что оба столбца проиндексированы, иначе время будет простоО (п)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...