Выбрать связанные таблицы


Amster
Member
Откуда: Россия
Сообщений: 9
Подскажите, как сделать.

Необходимо вычислить максимальное значение параметра Volume для каждого DeviceId в таблице.

Например:

Id........ DeviceId........ Volume....... 1............. 1.............. 4......... 2............. 2.............. 92........ 3............. 3.............. 2......... 4............. 1.............. 70........ 5............. 2.............. 8......... 6............. 1.............. 3.........
В результате нужно вывести строки:
DeviceId = 1 Volume = 70 Id = 4
DeviceId = 2 Volume = 92 таблицы Id = 2
DeviceId = 3 Volume = 2 Id = 3

Но таблица содержит более 200 000 значений!! Поэтому думаю создать 2 таблицы:
1 - таблица table1 со всеми данными, в т.ч. 'DeviceId'
2 - таблица table2 с одним полем 'DeviceId'

Т.е. при добавлении данных в 1 таблицу, проверять, есть ли DeviceId во второй. Если нет - добавлять его туда.
А уже потом при запросе максимального значения каждого DeviceId просто выбирать из таблицы 2 список DeviceId (их там будет 5-10), и потом уже по этим 5-10 значениям производить поиск по 1 таблице!!

Это должно значительно ускорить работу БД!

Подскажите, пожалуйста, знающие люди, как можно реализовать такой подход?

P.S.

SELECT MAX(`Volume`) FROM `table1` GROUP BY `DeviceId` - такой запрос для 1 таблицы при большом количестве строк очень медленно работает!
Поэтому и перехожу к использованию двух. Amster
Member
Откуда: Россия
Сообщений: 9
точнее вот такой запрос для 1 таблицы тормозит: SELECT FROM `table1` WHERE `Volume` IN (SELECT MAX(`Volume`) FROM `table1` GROUP BY `DeviceId`) 0xff
Member
Откуда:
Сообщений: 754
Структуру table1 можно посмотреть? Amster
Member
Откуда: Россия
Сообщений: 9
0xff Структуру table1 можно посмотреть?

так заполняются поля первой таблицы

INSERT INTO table1 (DeviceId, DateTime, Volume, и ещё порядка 10 значений) VALUES (.........)";
поле Id автоинкрементное.

Т.е. при заполнении таблицы нужно как-то проверять, есть ли новый DeviceId в таблице 2? Если нет, то добавляем в table2 новый DeviceId.

Это при заполнении.

-------------------------------

При запросе макс.значений нужно выбрать из table2 все DeviceId (они там должны быть уникальные) и вывести полностью поля, где для каждого DeviceId поле Volume максимальное.

Amster
Member
Откуда: Россия
Сообщений: 9
Id bigint(20)
DeviceId int(5)
DateTime DateTime
....
....
.... Amster
Member
Откуда: Россия
Сообщений: 9
И ещё: при явном указании DeviceId SELECT FROM table1 WHERE `DeviceId` = 1 AND `Id` = (SELECT MAX(`Id`) FROM `table1` WHERE `DeviceId` = 1);
запрос даже при 200 000 записей выполняется почти моментально!

Поэтому и решил держать DeviceId в отдельной таблице, а не пересматривать их все постоянно в поисках новых.

0xff
Member
Откуда:
Сообщений: 754
Можно посмотреть структуру таблицы ЦЕЛИКОМ? включая индексы Amster
Member
Откуда: Россия
Сообщений: 9
0xff Можно посмотреть структуру таблицы ЦЕЛИКОМ? включая индексы

Да, конечно:

Поле Тип Ноль По умолчанию Комментарии Id bigint(20) Нет DeviceId int(5) Нет 0 DateTime DateTime Latitude double Нет 0 Longitude double Нет 0 Altitude double Нет 0 Имя индекса Тип Количество элементов Поле PRIMARY PRIMARY 3070 Id DeviceId INDEX 4 DeviceId 0xff
Member
Откуда:
Сообщений: 754
SELECT FROM `table1` x, (SELECT `DeviceId`, MAX(`Volume`) AS `Volume` FROM `table1` GROUP BY `DeviceId`) y WHERE x.`DeviceId` = `y.DeviceId ` AND x.`Volume` = y.`Volume` Amster
Member
Откуда: Россия
Сообщений: 9
0xff, спасибо, вы гений!! спасибо! так быстро, что моргнуть не успеваю!!

не подскажете, будет ли такая скорость при базе в 1 000 000 записей?
или всё же надо как-то думать о второй таблице со значениями DeviceId?

C#C++
Member [заблокирован]
Откуда: Суровые северные земли
Сообщений: 2636
Пробуем "аналитический" вариант: select /здесь придется перечислить все поля таблицы/ from ( select, @rn := if(@olddid = DeviceId, @rn + 1, 1) rn, @olddid := DeviceId from table1, (select @olddid := -1, @rn := 0)t order by DeviceId, Volume desc) t where rn = 1 javajdbc
Member
Откуда: Montreal
Сообщений: 17798
Кстати, в задачах такого рода надо определять ситуацию
с несколькими махимальными значениями.
Решение ОхFF вернет все результаты,
Решение C#C++ вернет единственый (для групы) махимум
неопределено выбраный если имеются несколько. C#C++
Member [заблокирован]
Откуда: Суровые северные земли
Сообщений: 2636
javajdbc Решение C#C++ вернет единственый (для групы) махимум Моё можно доработать, чтоб все максимумы возвращало (если понадобится) javajdbc
Member
Откуда: Montreal
Сообщений: 17798
C#C++ javajdbc Решение C#C++ вернет единственый (для групы) махимум Моё можно доработать, чтоб все максимумы возвращало (если понадобится)

да-да, ето понятно. Я просто отметил что надо задачу уточнять.

0xff
Member
Откуда:
Сообщений: 754
Amster не подскажете, будет ли такая скорость при базе в 1 000 000 записей?
Увы, я сегодня забыл дома свой хрустальный шар.
Предлагаю самостоятельно сгенерить миллион записей в таблицу и проверить. Между сообщениями интервал более 1 года.
Naked
Member
Откуда:
Сообщений: 1
Добрый вечер.
Не могу сообразить как сделать запрос, выполняющий следующее:

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

Требуется получить строку из базовой таблице и все соответствующие ей дополнительные параметры из второй таблице. И так для каждой строки из базовой таблице.

Если делать примерно так:
SELECT
FROM `basic_tarif` base, `additional_tarif` addit
WHERE addit.at_bt_id = base.bt_id

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

Спасибо.

miksoft
Member
Откуда:
Сообщений: 36427
Подозреваю, что вам нужен LEFT JOIN.

В следующий раз прошу не некропостить без причины. Тему закрываю.

Виртуальные форумы   Темы из всех форумов за 3 дня   Мои избранные форумы Использование СУБД   Microsoft SQL Server   Firebird, InterBase   Oracle   Microsoft Access   IBM DB2, WebSphere, IMS, U2, etc   MySQL   PostgreSQL   OLAP и DWH   Sybase ASA, ASE, IQ   Informix   Другие СУБД   FoxPro, Visual FoxPro   Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M   SQLite   NoSQL, Big Data Дискуcсии   Сравнение СУБД   Проектирование БД   Работа   ERP и учетные системы   Разработка информационных систем   Тестирование и QA   Отчетные системы   Просто треп   Наши за рубежом   Сертификация и обучение   Hardware   Управление процессом разработки ИС   Юридические вопросы в ИТ Microsoft.NET   WinForms,.Net Framework   ASP.NET   ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM   WPF, Silverlight   WCF, Web Services, Remoting Программирование   Delphi   C++   Visual Basic   Программирование   Java   Разработка под мобильные платформы   PowerBuilder   Microsoft Office   SharePoint   XML, XSL, XPath, XQuery Web Технологии   PHP, Perl, Python   HTML, JavaScript, VBScript, CSS Администрирование ОС   Windows   Unix-системы   Другие: Mac OS, PalmOS, BeOS, PocketPC SQL.RU   Обсуждение нашего сайта   Вопрос-Ответ   Test
Источник: http://www.sql.ru/forum/593211/vyborka-iz-dvuh-svyazannyh-tablic



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Sql запрос на выборку записей из двух связанных таблиц - БД в - Поделка из палочек своими руками

Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы Выбрать связанные таблицы