Сложный запрос SQL, отношение один ко многим - PullRequest
1 голос
/ 14 апреля 2010

У меня такой запрос, что мне нужно получить

  1. Конкретная собака
  2. Все комментарии, связанные с этой собакой
  3. Пользователь, оставивший каждый комментарий
  4. Все ссылки на изображения собаки
  5. пользователь, который разместил каждую ссылку

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

 SELECT s.dog_id,
        s.name,
        c.comment,
        c.date_added AS comment_date_added,
        u.username AS comment_username,
        u.user_id AS comment_user_id,
        l.link AS link,
        l.date_added AS link_date_added,
        u2.username AS link_username,
        u2.user_id AS link_user_id
 FROM dogs AS d
 LEFT JOIN comments AS c
 ON c.dog_id = d.dog_id
 LEFT JOIN users AS u
 ON c.user_id = u.user_id
 LEFT JOIN links AS l
 ON l.dog_id = d.dog_id
 LEFT JOIN users AS u2
 ON l.user_id = u2.user_id
 WHERE d.dog_id = '1'

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

Я изучил основы mySQL в последнее время, но это довольно далеко у меня над головой. Любая помощь будет замечательной. Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2010

Вы не можете запросить это в запросе 1 sql без отправки большого количества избыточных данных. поскольку комментарии и ссылки не имеют никакого отношения друг к другу, лучше всего выполнять эти вызовы отдельно.

итого 3 вызова: 1 для получения данных о собаке, 1 для получения комментариев / пользователя и 1 для получения ссылок / пользователя.

SELECT d.dog_id, d.name FROM dogs AS d WHERE d.dog_id = '1';

SELECT c.comment, c.date_added AS comment_date_added,
       u.username AS comment_username, u.user_id AS comment_user_id
       FROM comments AS c LEFT JOIN users AS u ON c.user_id = u.user_id
       WHERE c.dog_id = '1';

SELECT l.link AS link, l.date_added AS link_date_added,
    u.username AS link_username, u.user_id AS link_user_id
       FROM links AS l LEFT JOIN users AS u ON l.user_id = u.user_id
       WHERE l.dog_id = '1';

причина в том, что, хотя вы можете достаточно хорошо присоединиться к таблице собак / комментариев, когда вы начинаете пытаться присоединиться к ссылкам - как вы связываете ссылку с комментарием? нет очевидного соединения, поэтому ваш единственный способ сделать это - использовать OUTER JOIN. это приведет к большому количеству избыточных данных в ваших вызовах.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...