2010-10-20 7 views
3

Nous avons trois tables:Essayer d'écrire un MySQL requête de jointure

p: 

<` 
+-----+-------+-------+--------+--------+ 
| pno | pname | color | weight | city | 
+-----+-------+-------+--------+--------+ 
| p1 | nut | red |  12 | London | 
| p2 | bolt | green |  17 | Paris | 
| p3 | screw | blue |  17 | Rome | 
| p4 | screw | red |  14 | London | 
| p5 | cam | blue |  12 | Paris | 
| p6 | cog | red |  19 | London | 
+-----+-------+-------+--------+--------+ 
` 

s: 


+-----+-------+--------+--------+ 
| sno | sname | status | city | 
+-----+-------+--------+--------+ 
| s1 | Smith |  20 | London | 
| s2 | Jones |  10 | Paris | 
| s3 | Blake |  30 | Paris | 
| s4 | Clark |  20 | London | 
| s5 | Adams |  30 | Athens | 
+-----+-------+--------+--------+ 


sp: 


+-----+-----+-----+ 
| sno | pno | qty | 
+-----+-----+-----+ 
| s1 | p1 | 300 | 
| s1 | p2 | 200 | 
| s1 | p3 | 400 | 
| s1 | p4 | 200 | 
| s1 | p5 | 100 | 
| s1 | p6 | 100 | 
| s2 | p1 | 300 | 
| s2 | p2 | 400 | 
| s3 | p2 | 200 | 
| s4 | p2 | 200 | 
| s4 | p4 | 300 | 
| s4 | p5 | 400 | 
+-----+-----+-----+ 

Ce que nous devons accomplir: Que GRTQ soit la quantité totale de parties vertes et rouges de toutes sortes expédiés par chaque fournisseur avec le numéro de fournisseur Si . Obtenir la table contenant les tuples, où GRTQ> 300. Lister le résultat dans l'ordre croissant des quantités totales.

Des idées brillantes? Je posterai certaines de mes tentatives sous peu.

Répondre

2

Voici votre requête:

SELECT s.sno, SUM(sp.qty) as GRTQ 
FROM s, p, sp 
WHERE s.sno = sp.sno AND p.pno = sp.pno AND (p.color = "red" OR p.color="green") 
GROUP BY s.sno, s.sname 
HAVING GRTQ > 300 
ORDER BY GRTQ ASC; 

The resulting output is: 
+-----+------+ 
| sno | GRTQ | 
+-----+------+ 
| s4 | 500 | 
| s2 | 700 | 
| s1 | 800 | 
+-----+------+ 

Vous pouvez le vérifier en calculant vous-même.

-à-dire les parties rouges ou verts sont p1, p2, p4, p6

Parmi ceux-ci:

s4 fourni uniquement P2 et P4, en quantités de 200 et 300, respectivement. Total = 500

s2 fourni uniquement p1 et p2, en quantités de 300 et 400, respectivement. Total = 700

s1 fourni toutes les pièces dans ces quantités: 300 + 200 + 200 + 100 = 800 total

2

Essayez ceci:

SELECT 
    s.sno, 
    s.sname, 
    SUM(sp.qty) AS `GRTQ` 
FROM 
    sp 
INNER JOIN 
    s 
ON 
    s.sno = sp.sno 
INNER JOIN 
    p 
ON 
    p.pno = sp.pno 
WHERE 
    (p.color = 'red' or p.color = 'green') 
GROUP BY 
    s.sno, 
    s.sname 
HAVING 
    `GRTQ` > 300 
ORDER BY 
    `GRTQ` ASC 

C'est la sortie sur vos données d'échantillon:

+------+-------+------+ 
| sno | sname | GRTQ | 
+------+-------+------+ 
| s1 | Smith | 800 | 
| s2 | Jones | 1400 | 
+------+-------+------+ 
2 rows in set (0.00 sec) 
+0

Cela fonctionne parfaitement, je vous remercie! –

+0

Vous n'avez pas accepté les réponses à vos questions. Si vous continuez à faire cela, les gens cesseront de vous aider. –