Что я должен использовать: внутреннее соединение или 3 разных запроса? - PullRequest
3 голосов
/ 05 февраля 2012

у меня 3 стола

  1. член
  2. видео участника
  3. фото участника

Для страницы профиля пользователя, должен ли я использовать один запрос с внутренним объединением, например

SELECT member.*,member_photo.*,member_video.* 
FROM (member 
    INNER JOIN member_photo ON member.member_id = member_photo.member_id
) 
INNER JOIN member_video ON member.member_id = member_video.member_id

затем отправляет видео в массив видео и фотографии в массив фото, но здесь запрос находит одинаковые фотографии для каждого видео, поэтому я должен проверить, был ли этот элемент добавлен в массив ранее.

Или я должен использовать 3 запроса: сначала найти информацию об участнике, затем еще один запрос для фотографий участников и еще один запрос для видео участников? Какой способ я должен использовать?

Ответы [ 5 ]

3 голосов
/ 05 февраля 2012

По моему мнению, здесь фото и видео - это две разные вещи, особенно они относятся к двум различным структурам на стороне приложения для дальнейшей обработки, поэтому я бы выбрал их отдельно, а именно:

SELECT member.*, member_photo.*
FROM member 
INNER JOIN member_photo ON member.member_id = member_photo.member_id

SELECT member.*, member_video.* 
FROM member 
INNER JOIN member_video ON member.member_id = member_video.member_id
1 голос
/ 05 февраля 2012

Я думаю, вам нужно использовать три запроса.

Рассмотрим одного человека, у которого есть 6 фотографий и 3 видео. Ваш запрос сгенерирует 18 строк данных. Это не полезно, особенно если реальные видео (а) большие и (б) выбраны в запросе.

Рассмотрим другого человека, у которого есть 100 фотографий, но они не публикуют видео. Этот человек вообще не будет представлен запросом с использованием внутренних объединений.

Рассмотрим человека, который вчера зарегистрировался и еще ничего не загрузил? Этот человек тоже не будет представлен.

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

member1     photo1-of-member1   video1-of-member1
member1     photo2-of-member1   video2-of-member1
member1     photo3-of-member1   ...empty...

тогда ты будешь счастлив. Не существует стандартного оператора запроса, который делает это, AFAIK.


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

Очевидно, что вы могли бы использовать внешние объединения вместо внутренних объединений с двумя запросами, чтобы вы всегда видели данные членов, но ... ну, я не вижу очевидного преимущества над тремя отдельными запросами. Я полагаю, что если задержка связи действительно астрономическая (например, ваше соединение приложения с базой данных выполняется по спутниковой линии, или приложение находится в Аргентине, а сервер базы данных находится в Индии), то, возможно, служебных данных достаточно, чтобы сделать два запросы предпочтительнее трех. Но я думаю, что это должно быть что-то необычное, чтобы оправдать использование двух запросов вместо трех.

0 голосов
/ 05 февраля 2012

Это будет зависеть от того, что будет делать ваше конечное приложение. Если, скажем, когда участник входит в систему, и вам нужна информация об этом участнике в данный момент, то было бы лучше иметь 3 разных запроса. Если, скажем, вы выполнили какую-то операцию с участием всех участников за один раз (например, отчет для всех участников), то переходите к внутреннему объединению.

0 голосов
/ 05 февраля 2012

Я думаю, вы могли бы получить то, что искали, введя предложение group by, чтобы возвращаемые ответы были сгруппированы по видео.

0 голосов
/ 05 февраля 2012

Попробуйте:

SELECT DISTINCT member.*,member_photo.*,member_video.* FROM (member INNER JOIN member_photo ON member.member_id = member_photo.member_id) INNER JOIN member_video ON member.member_id = member_video.member_id
...