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

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

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


Поделись с друзьями



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



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

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

ШОКИРУЮЩИЕ НОВОСТИ