LINUX.ORG.RU

Повторение данных в sql join


0

0

Есть таблица downloads, в которой хранится описание программы, и есть таблица files, в которой хранится ссылка на файл. У одной программы может быть много файлов (пакеты под разные дистрибутивы, патчи, исходники, документация и так далее). Пока что связываю это таким образом:

select downloads.title, downloads.description, files.download_id, files.path from downloads,files where downloads.id = files.download_id;

Но если файлов у одной программы много, то в результате sql-запроса все поля из таблицы downloads повторяются, хотя реально они нужны лишь один раз. Можно ли как-нибудь этого избежать, и стоит ли?

Ответ на: комментарий от anonymous

Я это читал. И теперь обращаюсь к вменяемым людям на лоре, как же сделать это правильно.

RommeDeSerieux
() автор топика

(a1) SELECT download_id, ... FROM downloads WHERE conditions-on-downloads;
(a2) foreach id (download_ids from result-of-a1)
         SELECT ... FROM files WHERE download_id = id;

(b1) SELECT download_id, ... FROM downloads WHERE conditions-on-downloads;
(b2) SELECT download_id, ... FROM files WHERE download_is IN (downloads_ids from result-of-b1);

anonymous
()
Ответ на: комментарий от anonymous

Решение a больше похоже на шутку, а вот b — единственный вариант, который я вижу. Но мне не нравится то, что при увеличении количества таблиц (авторы программ, зависимости) количество запросов в IN() тоже будет увеличиваться.

RommeDeSerieux
() автор топика
Ответ на: комментарий от RommeDeSerieux

> Решение a больше похоже на шутку

Решение a убирает все дублирующиеся поля включая download_id, но делает N запросов вместо одного. М.б. экономия на данных покроет расходы на N запросов — при такой, мм, странной постановке задачи можно предположить даже такое.

> Но мне не нравится то, что (...) количество запросов в IN() тоже будет увеличиваться.

Сорри, а в чём тут проблема? (пример запроса можно?)

anonymous
()
Ответ на: комментарий от RommeDeSerieux

// абстрактно

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

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.