SQLite запрос трех таблиц - PullRequest
       0

SQLite запрос трех таблиц

1 голос
/ 16 декабря 2010

Я работаю над приложением для Android, которое отображает некоторую информацию из базы данных sqlite в виде списка. Мне нужна помощь в разборе моего запроса.

База данных выглядит так:

[monitors] 1 --- <has> --- * [results] 1 --- <has> --- * [steps]

Table monitors has columns: _id | warning_threshold | alarm_threshold | monitor_name
Table results  has columns: _id | monitor_id        | timestamp       | test_info
Table steps    has columns: _id | result_id         | correct         | response_time

Я пытаюсь сделать запрос, который вернул бы:
1) Все строки и столбцы из таблицы мониторов.
2) Новейшая test_info для каждого монитора из таблицы результатов.
3) Подсчитайте число правильных = истинных для каждого результата из таблицы шагов.

Возвращенный курсор должен выглядеть примерно так:

_id | monitor_name | warning_threshold | alarm_threshold | test_info   | correct_count
1   | 'hugo'       | 1000              | 1500            | 'some info' | 7
2   | 'kurt'       | 800               | 1200            | 'info.....' | 5

Мой запрос:

SELECT * FROM
  (SELECT monitors._id AS _id,
  monitors.monitor_name AS monitor_name,
  monitors.warning_threshold AS warning_threshold,
  monitors.alarm_threshold AS alarm_threshold,
  results.test_info AS test_info
  FROM monitors
  LEFT JOIN results
  ON monitors._id = results.monitor_id
  ORDER BY results.timestamp ASC) AS inner
GROUP BY inner._id;

У меня почти получилось. Я могу получить информацию от мониторов и результатов, мне все еще нужно получить правильный_счет. Любая помощь с сортировкой этого запроса будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Это мой подход, использующий комбинацию левых соединений, подзапросов и коррелированных подзапросов:

SELECT monitors._id AS _id,
 monitors.monitor_name AS monitor_name,
 monitors.warning_threshold AS warning_threshold,
 monitors.alarm_threshold AS alarm_threshold,
 LastResults.test_info AS test_info,
 COUNT(CorrectSteps._id) AS correct_count
FROM monitors
LEFT JOIN 
 (SELECT * FROM results as r1 where timestamp =
   (SELECT Max(r2.timestamp) FROM results AS r2 WHERE r1.monitor_id=r2.monitor_id)) LastResults
ON monitors._id = LastResults.monitor_id
LEFT JOIN 
 (SELECT * FROM steps WHERE correct = 'true') CorrectSteps
ON LastResults._id = CorrectSteps.result_id
GROUP BY monitors._id;
1 голос
/ 16 декабря 2010

Нечто подобное должно работать. Я не смог проверить это, но, надеюсь, это, по крайней мере, поможет вам начать. Обратите внимание, что этот запрос даже не близок к оптимизированному. Написал это быстро во время моего обеда:)

SELECT m._id,
       m.monitor_name,
       m.warning_threshold,
       m.alarm_threshold,
       (SELECT r.test_info
          FROM results r
         WHERE r.monitor_id = m._id
         ORDER BY r.timestamp ASC
         LIMIT 1) as 'test_info',
       (SELECT COUNT(_id)
          FROM steps s
         WHERE s.result_id IN (SELECT _id FROM results WHERE monitor_id = m._id)
           AND s.correct = 'true') as 'correct_count'
  FROM monitor m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...