@SibVektor

Как составить SQL запрос из нескольких таблиц?

Доброго дня.
Имеется несколько таблиц с данными (table1, table2, table3), каждая таблица в обязательном порядке содержит два идентификатора (id1, id2) и временную метку (stamp).
Нужно из каждой таблицы вытащить определенные параметры ОДНИМ запросом:
из table1: value1 и value2
из table2: valueA
из table3: valueXX, valueYY
Условие поиска: по обоим идентификаторам и в нужном временном интервале, результаты отсортировать по времени.
Я уже весь извелся, помогите составить запрос =)
  • Вопрос задан
  • 14623 просмотра
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Как написал Decadal из вашего вопроса не ясно как таблицы связываются.
Но вобщем случае нужно использовать join, примерно следующим образом:
select t1.value1, t1.value2, t2.valuea, t3.valuexx, t3.valueyy
from table1 as t1
join table2 as t2 on t2.id1 = t1.id1
join table3 as t3 on t3.id1 = t1.id1
where t1.stamp > XXX
order by t1.stamp

Это схематично. Не зная, как связаны таблицы, трудно что-то больше сказать.
Ответ написан
На самом деле всё простое, ведь у нас есть очень важное ограничение в каждой таблице в день только по одной записи... Что это может нам дать, поскольку в каждой из таблиц есть штамп времени, то в join условие нужно для всех трёх таблиц добавить равенство даты (год, месяц, день) между собой, тогда для всего массива датчиков будет формироваться ровно по одной строке на каждый день из диапазона. Предполагая, что штамп времени во всех таблицах назван одинаково, можно составить примерный запрос:
SELECT pot_volt.room_id rid, pot_volt.pot_id pid,
 setp_volt voltTarget, raw_volt volt, -- pot_volt
 avg_amp amp, -- pot_power
 cr, caf2, -- bath_an
 metal_height meHeight, bath_height baHeight, temperature baTemp -- pot_bath
 FROM pot_volt
 JOIN pot_power ON pot_power.pot_id=pid AND pot_power.room_id=rid AND cast(pot_volt.date_stamp as date) = cast(pot_power.date_stamp as date)
 JOIN bath_an ON bath_an.pot_id=pid AND bath_an.room_id=rid AND cast(bath_an.date_stamp as date) = cast(pot_volt.date_stamp as date)
 JOIN pot_bath ON pot_bath.pot_id=pid AND pot_bath.room_id=rid AND cast(pot_bath.date_stamp as date) = cast(pot_volt.date_stamp as date)
 WHERE rid=1 AND pid=36 AND pot_volt.date_stamp BETWEEN 1497336487 AND 1498027687
 ORDER BY pot_volt.date_stamp DESC

Это общая идея, поскольку мне не известны форматы нужных столбцов, возможно нужно немного адаптировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы