2009-10-07 6 views
0

configuration:Requête renvoie trop peu de lignes

mysql> create table product_stock(
     product_id integer, qty integer); 
Query OK, 0 rows affected (0.17 sec) 

mysql> create table product(
     product_id integer, product_name varchar(255)); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert into product(product_id, product_name) 
     values(1, 'Apsana White DX Pencil'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into product(product_id, product_name) 
     values(2, 'Diamond Glass Marking Pencil'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into product(product_id, product_name) 
     values(3, 'Apsana Black Pencil'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into product_stock(product_id, qty) 
     values(1, 100); 
Query OK, 1 row affected (0.03 sec) 

ma première requête:

mysql> SELECT IFNULL(SUM(s.qty),0) AS stock, 
       product_name 
     FROM product_stock s 
     INNER JOIN product p ON p.product_id=s.product_id 
     GROUP BY product_name 
     ORDER BY product_name; 

retours:

+-------+---------------------------+ 
| stock | product_name    | 
+-------+---------------------------+ 
| 100 | Apsana White DX Pencil | 
+-------+---------------------------+ 
1 row in set (0.00 sec) 

Mais je veux avoir le résultat suivant:

+-------+------------------------------+ 
| stock | product_name     | 
+-------+------------------------------+ 
| 0 | Apsana Black Pencil   | 
| 100 | Apsana White DX Pencil  | 
| 0 | Diamond Glass Marking Pencil | 
+-------+------------------------------+ 

Pour obtenir ce résultat, quelle requête mysql dois-je exécuter?

Répondre

1

Vous devez retourner votre rejoindre et l'utiliser LEFT JOIN au lieu de INNER JOIN:

SELECT IFNULL(SUM(s.qty),0) AS stock, product_name 
FROM product AS p 
LEFT JOIN product_stock AS s ON p.product_id=s.product_id 
GROUP BY product_name 
ORDER BY product_name; 
0

Si j'ai bien lu votre question, tout ce que vous devez faire est de changer votre INNER JOIN en RIGHT OUTER JOIN.

+0

RIGHT OUTER JOIN ne fonctionne pas. – Tareq

1

Effectuez une jointure externe entre product et product_stock, et non une jointure interne entre product_stock et product.

(Bon travail à rendre la question claire, complète et sans ambiguïté.)

+0

Merci pour votre commentaire. – Tareq

0

Si vous utilisez la table de stock en tant que base, alors vous obtiendrez seulement un article, puisqu'il a seulement 1 point de référence à l'autre table.

Utilisez la table des produits et joignez-vous à la table des stocks. Vous aurez probablement la valeur NULL en stock, mais vous pouvez gérer cela avec le code côté serveur.

+0

J'ai besoin d'une tâche plus complexe à faire. J'ai donc besoin du résultat comme je l'ai demandé. – Tareq

2

Une jointure interne renvoie uniquement les lignes qui ont une correspondance dans les deux tables. C'est pourquoi les résultats pour lesquels il n'y a pas de ligne dans le tableau de stock ne donnent aucun résultat. Une jointure GAUCHE retournera toutes les lignes de la première table et une jointure RIGHT renverra toutes les lignes de la seconde table.

Dans votre requête, vous attendez tous les résultats de la seconde table, alors changez votre jointure interne en une jointure RIGHT.

Il y a un tutoriel ici, avec quelques exemples:

http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html

+0

Très bonne explication. Merci André. Si je veux joindre toutes les lignes des deux tables, que dois-je faire? – Tareq

+1

Pour retourner tous les résultats des deux tables, vous aurez besoin de quelque chose appelé 'FULL OUTER JOIN', mais malheureusement, MySQL ne supporte pas ce type de jointure directement. Cependant, vous pouvez l'émuler avec deux jointures: http://en.wikipedia.org/wiki/Join_%28SQL%29#Full_outer_join –

+0

Cher André, maintenant j'ajoute un autre champ dans la table de stock appelé branch_id. Lorsque j'utilise la clause where, seules les lignes correspondantes sont renvoyées. Y at-il un moyen de retourner toutes les lignes de la table de produit où un branch_id particulier dans la table de stock? – Tareq

Questions connexes