Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Подскажите, пожалуйста, как сделать такую выборку:
В таблице есть поле с номерами устройств DeviceId.
Задача: получить поля с максимальными значениями Индексов для каждого из устройств. Но устройства могут добавляться!
Вот пример запроса для выдачи информации от 2 устройств.
SELECT * FROM `table` WHERE `Index` = (SELECT MAX(`Index`) FROM `table` WHERE `DeviceId` = 1) OR `Index` = (SELECT MAX(`Index`) FROM `table` WHERE `DeviceId` = 2)
Подскажите, как можно сначала узнать количество уникальных DeviceId и потом уже подставить каждое уникальное в вышенаписаный код?
Неактивен
SELECT * FROM `table` WHERE `index` IN (SELECT MAX(`index`) FROM `table` GROUP BY 'DeviceId`);
Неактивен
Спасибо.
Не подскажете, можно как-нибудь оптимизировать эти действия? Может как-то проиндексировать специально?
Просто в базе более 200 000 записей и такой запрос выполняется очень долго...
Может как-то заранее сделать, допустим, отдельное поле какое-то?
Неактивен
ALTER TABLE `table` ADD INDEX (`DeviceID`, `index`);
ALTER TABLE `table` ADD INDEX (`index`);
Это создаст индексы, по которым такой запрос должен выполняться очень быстро.
Неактивен
Возможно, запрос стоит переписать в виде объединения двух таблиц - так он может работать
быстрее (опять же, на этих индексах):
SELECT t1.*
FROM `table` t1
JOIN (SELECT MAX(`index`) as `index` FROM `table` GROUP BY 'DeviceId`) t2 USING (`index`);
Неактивен
Спасибо, буду пробовать.
Неактивен
Подскажите, как сделать в таком случае немного по-другому, а именно:
- создать 2 таблицы:
1 - таблица со всеми данными, в т.ч. 'DeviceId'
2 - таблица с одним полем 'DeviceId'
Т.е. при добавлении данных в 1 таблицу, проверять, есть ли DeviceId во второй. Если нет - добавлять его туда.
А уже потом при запросе максимального значения каждого DeviceId просто выбирать из таблицы 2 список DeviceId (их там будет 5-10), и потом уже по этим 5-10 значениям производить поиск по 1 таблице!!
Это должно значительно ускорить работу БД!
Подскажите, пожалуйста, знающие люди, как можно реализовать такой подход?
Неактивен
Честно говоря, не понял, зачем Вам нужна отдельная таблица с одним полем DeviceId.
Для того, чтобы вручную сформировать запрос по первой таблице? А чем Вам не нравится
группировка?
Неактивен
paulus написал:
... А чем Вам не нравится группировка?
В принципе нормальный подход денормализации - хранить в отдельной таблице результаты группировки, складывая их туда после апдейтов
Неактивен
Если делать денормализацию - то лучше уж тогда сделать отдельную табличку с 2 полями
(DeviceID, Max_index) - по ней можно точечно выбрать данные по основному запросу.
Неактивен
paulus написал:
Если делать денормализацию - то лучше уж тогда сделать отдельную табличку с 2 полями
(DeviceID, Max_index) - по ней можно точечно выбрать данные по основному запросу.
Подскажите, пожалуйста, как это организовать?
Т.е. как сделать, чтобы при отсылке записи в БД шла проверка на DeviceID и Max_index?
Сейчас отсылка идёт просто 1 командой в одну таблицу:
INSERT INTO table1 (DeviceId, .......) VALUES ('$deviceid', ..........)";
Неактивен
Ну и сделайте еще UPDATE table2 SET maxindex = IF(maxindex < $idx, $idx, maxindex) WHERE DeviceID=$deviceid;
Неактивен
Или вот-так
Неактивен