Russian Qt Forum
Апрель 28, 2024, 00:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Структура бд  (Прочитано 13971 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #15 : Август 04, 2014, 12:32 »

Тьфу. Не про добавление устройства говорил, а про требуемый вид таблицы ответа на запрос
Записан
ammaximus
Гость
« Ответ #16 : Август 04, 2014, 12:41 »

Если устройства могут добавляться, то:
1) сначала базу можно опросить на уникальность устройств
2) Сделать запрос для каждого устройства, при этом в заголовке колонки можно записать его имя
3) Объединить таблицы по колонке время.

2 и 3 имею в виду, что нужно написать в одном запросе

Код:
Cursor c = sqlExec("SELECT time DISTINCT(time) FROM mainTable ");
while(c.hasNext()){
sqlExec("SELECT * FROM mainTable WHERE device = c.device" GROUP BY time)
}

Как одним запросом то?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #17 : Август 04, 2014, 13:06 »

Как одним запросом то?

Повторюсь, что плохо знаком с БД. Работал давно. БД и Qt ни разу не пробовал, но всё же попытаюсь (как бы я сделал в Access VBA):
База имеет вид, как предложил Пантер.
А как тебе такой вариант:

TimeDeviceValue
10:43barometer100
10:48thermometer180
10:48barometer120

1) запрашиваем все уникальные Device (надеюсь, знаете, как сделать), получили QStringList devices девайсов
2) создаём некий QString query и пошли создавать запрос:

Код:
query = "SELECT timeTbl.Time AS [TIME], ";
for (int i = 0; i < devices.size(); ++i)        //использовать лучше foreach
{
    query += QString("device%1.Value AS [%2], ").arg(i).arg(devices.at(i))
}

Таким образом мы поименовали колонки на нужные. Теперь нужно выбрать строки   (запятую, которая получилась на конце нужно стереть)
Код:
query += "FROM mainTable as timeTbl "

Сейчас мы пока что выводим только время из главной таблицы. Присоединяем каждое устройство:
Код:
for (int i = 0; i < devices.size(); ++i)
{
    QString subQuery ("SELECT Time, Value From mainTable WHERE Device = %1").arg(devices.at(i))
    query += QString("LEFT JOIN (%1) AS device%2 ON  (timeTbl.Time= device%2.Time) ").arg(subQuery).arg(i);
}
Вот тут точно не помню, как происходит объединение значений с Null, но, всё же:
Код:
query += GROUP BY timeTbl.Time

Выполняем запрос query.
Вроде бы примерно так. Настоятельно рекомендую перепроверить всё.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #18 : Август 04, 2014, 13:07 »

Советую почитать про Join и про вложенные запросы - это путь к решению вашей задачи
Записан
Bepec
Гость
« Ответ #19 : Август 04, 2014, 13:10 »

Помучал я sqlbrowser - выбрать из одной таблицы данные из нескольких столбцов со сравнением одного нельзя. (да, я понял что написал Веселый)

По-моему тут просто неверный подход к желаемому результату. Точнее SQL не позволяет таких вещей.

Ваша "желаемая" выборка должна содержать N столбцов.
Их количество на момент запроса неизвестно.
Добавлять столбцы можно только видоизменяя запрос.
Вывод - ваше желание идёт вразрез с имеющимися возможностями и без логического блока, который определит количество и прочие связи столбцов (название/значение), тут не обойтись.

SQL просто не имеет возможностей выдавать фиг знает какие выборки. Оно рассчитано на работу с четкой структурой БД Улыбающийся

PS это моё мнение, вполне возможно что я попробую join и его изменю Веселый
« Последнее редактирование: Август 04, 2014, 13:12 от Bepec » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #20 : Август 04, 2014, 13:14 »

PS это моё мнение, вполне возможно что я попробую join и его изменю Веселый
О да  Смеющийся Смеющийся Смеющийся Смеющийся Смеющийся
Записан
Bepec
Гость
« Ответ #21 : Август 04, 2014, 13:17 »

Нет, не изменю. Проблема как и ожидалось находится в дублировании записей.

time/termo/baro/hermo
time/termo/hermo/baro
time/baro/termo/hermo
time/baro/hermo/termo
time/hermo/baro/termo/
time/hermo/termo/baro/

Конечно этого можно избежать сделав N вложенных селектов по числу уникальных устройств, но... Но я не настолько сильно хочу извращений Веселый

PS ну и кто не понял - то у нас будет N*N вариаций записей. Прикольно Улыбающийся
« Последнее редактирование: Август 04, 2014, 13:22 от Bepec » Записан
ammaximus
Гость
« Ответ #22 : Август 04, 2014, 13:25 »

В жизни не подумал бы, что так огребу на такой простой задаче...
Записан
Bepec
Гость
« Ответ #23 : Август 04, 2014, 13:29 »

Задача поставлена неправильно. Вы как будто лопатой шуруп заворачиваете Улыбающийся
Вон  __Heaven__ предложил рабочий способ с перебором всех уникальных устройства. И из этих данных вы можете сделать всё что угодно.

PS то что его способ вам не нравится или противен - это не повод его не применять Веселый
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #24 : Август 04, 2014, 13:35 »

Сейчас в аксесе навояю для наглядности. (если получится вспомнить  Показает язык )
Записан
Bepec
Гость
« Ответ #25 : Август 04, 2014, 13:40 »

В Путь. Я Аксес вспоминаю с ужасом. Пришлось однажды делать там красивые выборочки. Где то строк на 50 запрос был Веселый
Записан
ammaximus
Гость
« Ответ #26 : Август 04, 2014, 13:40 »

Цитировать
PS то что его способ вам не нравится или противен - это не повод его не применять
Ни в коем случае, мне нравится любой рабочий способ. Но книгу по sql я пока успел дочитать только до запросов к связанным таблицам, поэтому пытался решить задачу известными инструментами.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #27 : Август 04, 2014, 13:40 »

УСПЕХ!

Код:
SELECT DISTINCT mainTable.Time, barometer.Value as BAROMETER, thermometer.Value as THERMOMETER
FROM (mainTable

LEFT JOIN (SELECT mainTable.Time, mainTable.Value
                  FROM mainTable
                  WHERE mainTable.Device="barometer") AS barometer ON barometer.Time = mainTable.Time)

LEFT JOIN (SELECT mainTable.Time, mainTable.Value
                  FROM mainTable
                  WHERE mainTable.Device="thermometer") AS thermometer ON thermometer.Time = mainTable.Time

Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #28 : Август 04, 2014, 13:43 »

Запрос составляете примерно тем методом, что я писал выше.
Работы от силы на 2 часа с изучением всех join и т.п.
Советую потренироваться в консоли или в том же Access
Записан
ammaximus
Гость
« Ответ #29 : Август 04, 2014, 13:45 »

__Heaven__ , нет слов как я благодарен. Пантер, Верес всем спасибо за участие, пойду пробовать.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.