2010-08-18 14 views
0

Salut à tousLa combinaison des données de 2 tables dans 1 requête

Im ayant des problèmes en combinant les données de 2 tables pour 1 requête.

Maintenant, j'ai un je table nr1 avec les données brutes des restaurants et dans l'autre table nr2 un certain nombre de restaurants qui ont été classés. Donc, maintenant je veux sélectionner tous les restaurants et en même temps sélectionner les catégories de ce restaurant de table-nr2 et obtenir la valeur moyenne de ces catégories.

Comment puis-je faire cela dans une seule requête SQL?

+2

Le schéma serait utile –

+0

Pourriez-vous fournir des descriptions de vos tables de base de données? –

Répondre

1
SELECT r.*, 
     COALESCE(
     (
     SELECT AVG(grade) 
     FROM table_nr2 g 
     WHERE g.restaurant_id = r.id 
     ), 0) 
FROM table-nr1 r 
+0

+1 pour une alternative intéressante. Bien que pour ce qui est de sa valeur, j'évite généralement d'utiliser la sous-requête dans les clauses select. –

+0

@Conrad: pourriez-vous expliquer pourquoi éviteriez-vous les sous-requêtes? – Quassnoi

0

Vous devez effectuer une jointure. Dans ce cas, une jointure interne gauche semble très bien, ce qui correspond à la jointure par défaut. Vous pouvez utiliser l'aide de la syntaxe si le champ qui les relie est le même des deux côtés, de sorte que vous finiriez avec quelque chose comme ceci:

SELECT table-nr1.*, AVG(table-nr2.score) 
FROM table-nr1 
JOIN table-nr2 USING (restrauntId) 

Sinon, vous pouvez faire quelque chose qui les relie en utilisant une sur l'article comme celui-ci:

SELECT table-nr1.*, AVG(table-nr2.score) 
FROM table-nr1 
JOIN table-nr2 ON (table-nr1.restrauntId = table-nr2.restrauntId) 
+0

Je ne suis pas sûr de votre déclaration que la jointure interne gauche est le type de jointure par défaut, vous pouvez avoir une jointure gauche ou une jointure interne, les jointures gauche et droite sont utilisées pour spécifier laquelle des deux tables jointes doit retourner les lignes quand aucune ligne correspondante n'est trouvée dans l'autre table –

+0

Vrai ... je suppose que je ne pensais pas ce matin ... ce serait simplement une jointure interne ... qui est la valeur par défaut quand vous dites JOIN. – Boushley

1

vos restaurants ont supposant un nom et identifiant, et les commentaires ont vos une note

SELECT re.name, avg(ra.grade) 
FROM table-nr1 re 
LEFT JOIN table-nr2 ra ON re.id = ra.id 
GROUP BY re.name 

vous devez regrouper par tous les champs que vous souhaitez sélectionner qui ne sont pas agrégées et gauche signifie que vous obtiendrez tous les restaurants, qu'ils aient ou non des notes.

+0

+1 Belle description –

Questions connexes