2010-04-13 10 views
1

J'ai une requête telle que je dois obtenircomplexe requête SQL, relation un à plusieurs

  1. Un chien spécifique
  2. Tous les commentaires relatifs à ce chien
  3. L'utilisateur qui a posté chaque commentaire
  4. Tous les liens vers les images du chien
  5. l'utilisateur qui a posté chaque lien

J'ai essayé plusieurs choses et je n'arrive pas à comprendre comment l'utiliser. Voici ce que j'ai (condensé de sorte que vous n'avez pas à patauger dans tout):

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' 

Il est sorta près de travailler, mais ça ne me renvoie le premier commentaire, et le premier lien tout comme un grand tableau avec toutes les informations que j'ai demandées. Il y a plusieurs commentaires et liens par chien, donc j'en ai besoin pour me donner tous les commentaires et tous les liens. Idéalement, il retournera un objet avec dog_id, nom, commentaires (un tableau des commentaires), liens (un tableau des liens), puis les commentaires auront un tas de commentaires, date_added, nom d'utilisateur, et user_id et les liens auraient un tas de liens avec le lien, date_added, nom d'utilisateur et user_id. Cela doit fonctionner même s'il n'y a pas de liens ou de commentaires.

J'ai appris les bases de mySQL un peu récemment, mais c'est assez loin de ma tête. Toute aide serait merveilleuse. Merci!

Répondre

3

Vous ne pouvez pas interroger ceci dans une requête de 1 sql sans que beaucoup de données redondantes ne soient renvoyées. Parce que les commentaires et les liens n'ont aucun rapport les uns avec les autres, vous feriez mieux de faire ces appels séparément.

donc 3 appels au total: 1 pour récupérer les données du chien, 1 pour récupérer les commentaires/utilisateur, et 1 pour récupérer les liens/utilisateur.

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'; 

la raison est que même si vous pouvez joindre les chiens/table commentaires assez, quand vous commencez à essayer de se joindre aux liens - comment vous rapportez un lien vers un commentaire? il n'y a pas de jointure évidente donc votre seul moyen de le faire est d'utiliser un OUTER JOIN. Cela entraînera beaucoup de données redondantes dans vos appels.

également, ce genre de chose rend la mise en cache beaucoup plus facile et plus intuitive. D'après mon expérience, il est généralement plus facile de répondre à quelques questions d'ordre naturel que d'adhérer à un spaghetti. :)

+0

+1 - une seule requête fonctionnerait, et pourrait être un peu plus rapide, mais l'utilisation de trois requêtes plus petites simplifierait grandement les choses. –

+0

Rend ma vie plus facile de toute façon. Merci! – Ethan

Questions connexes