Déclaration de sélection simple ne retournant pas les données correctes


1

J'essaie de retourner des données, où je veux le nom de l'article (items.name), le nom du vendeur (vendeurs.nom), l'url du prix (prices.url), et le prix (prices.price) à partir de 3 tables différentes (articles, fournisseurs et prix) en utilisant la clé étrangère vid (identifiant du fournisseur) de prices.vid et vendors.vid et en affichant uniquement les résultats avec l'identifiant de l'article 3 (items.iid = '3') , mais je reçois aussi des résultats de différents ID d'article.

Voici ce que les tables ressemblent:

mysql> describe prices; 
+-------+------------------------+------+-----+---------+----------------+ 
| Field | Type     | Null | Key | Default | Extra   | 
+-------+------------------------+------+-----+---------+----------------+ 
| pid | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| price | decimal(10,2) unsigned | YES |  | NULL |    | 
| url | longtext    | YES |  | NULL |    | 
| iid | int(10) unsigned  | NO | MUL | NULL |    | 
| vid | tinyint(3) unsigned | NO | MUL | NULL |    | 
+-------+------------------------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 


mysql> select * from items; 
| iid | name      | scid | desc                                                        
| 1 | Ahtanum     | 3 | Ahtanum is ... 
| 2 | Amarillo     | 3 | Amarillo is ...                    
| 3 | 22 oz Beer Bottles Amber | 56 | 22 ounce amber... 


mysql> select * from prices; 
+-----+-------+--------------------------------------------------------------------------------------+-----+-----+ 
| pid | price | url                      | iid | vid | 
+-----+-------+--------------------------------------------------------------------------------------+-----+-----+ 
| 1 | 3.50 | homebrewhaven.com/id=10                  | 2 | 4 | 
| 2 | 4.50 | morebeer.com/id=15                  | 2 | 7 | 
| 3 | 11.99 | http://www.northernbrewer.com/default/beer-bottles-22-oz.html       | 3 | 1 | 
| 4 | 14.99 | http://www.austinhomebrew.com/product_info.php?products_id=993      | 3 | 2 | 
| 5 | 12.50 | http://www.midwestsupplies.com/22-oz-bottles-amber-case-of-12.html     | 3 | 3 | 
| 6 | 14.50 | http://store.homebrewheaven.com/22-oz-brown-beer-bottles-case-of-12-bottles-p69.aspx | 3 | 4 | 
| 7 | 12.95 | http://morebeer.com/view_product/15630//Bottles_-_22_oz_12        | 3 | 7 | 
| 8 | 14.99 | http://www.brewmasterswarehouse.com/product/0101545/case-22-oz-beer-bottle-amber  | 3 | 9 | 
+-----+-------+--------------------------------------------------------------------------------------+-----+-----+ 

Maintenant, quand j'exécute la requête:

SELECT distinct items.name, vendors.name, prices.url, prices.price 
FROM vendors, prices, items 
WHERE vendors.vid = prices.vid AND items.iid='3' 
ORDER BY prices.price; 

Je reçois aussi dans mon résultat de id prix 1 & 2 même si le IID (ID de l'article) sont 2 et non 3 comme je le veux dans la requête .... Sortie ci-dessous:

mysql> select distinct items.name, vendors.name, prices.url, prices.price FROM vendors, prices, items WHERE vendors.vid = prices.vid AND items.iid='3' ORDER BY prices.price; 
+--------------------------+-----------------------+--------------------------------------------------------------------------------------+-------+ 
| name      | name     | url                      | price | 
+--------------------------+-----------------------+--------------------------------------------------------------------------------------+-------+ 
| 22 oz Beer Bottles Amber | Homebrew Heaven  | homebrewhaven.com/id=10                 | 3.50 | 
| 22 oz Beer Bottles Amber | More Beer    | morebeer.com/id=15                  | 4.50 | 
| 22 oz Beer Bottles Amber | Nothern Brewer  | http://www.northernbrewer.com/default/beer-bottles-22-oz.html       | 11.99 | 
| 22 oz Beer Bottles Amber | Midwest Supplies  | http://www.midwestsupplies.com/22-oz-bottles-amber-case-of-12.html      | 12.50 | 
| 22 oz Beer Bottles Amber | More Beer    | http://morebeer.com/view_product/15630//Bottles_-_22_oz_12        | 12.95 | 
| 22 oz Beer Bottles Amber | Homebrew Heaven  | http://store.homebrewheaven.com/22-oz-brown-beer-bottles-case-of-12-bottles-p69.aspx | 14.50 | 
| 22 oz Beer Bottles Amber | Austin Homebrew  | http://www.austinhomebrew.com/product_info.php?products_id=993       | 14.99 | 
| 22 oz Beer Bottles Amber | Brewmasters Warehouse | http://www.brewmasterswarehouse.com/product/0101545/case-22-oz-beer-bottle-amber   | 14.99 | 
+--------------------------+-----------------------+--------------------------------------------------------------------------------------+-------+ 
8 rows in set (0.04 sec) 

Comme vous peut voir, je reçois les deux premiers résultats qui ont iid = 2, pas 3. Tout le reste devrait apparaître, mais pas ces deux premiers.

Des idées sur ce qui se passe?

+1

Votre tableau d'articles n'est pas joint correctement aux autres. Réécrivez votre requête en utilisant la syntaxe ANSI et votre problème deviendra plus clair. 14 sept.. 112011-09-14 16:45:08

+1

Par exemple: SELECT DISTINCT i.name , v.name , p.url , p.prix DE fournisseurs v INNER JOIN prix p SUR v.vid = p.vid INNER JOIN articles i ON p.iid = i.iid O i iid = '3' COMMANDER PAR p. 14 sept.. 112011-09-14 16:49:52

  0

Ça marche! Merci! 14 sept.. 112011-09-14 17:04:02

+2

Cela aurait vraiment dû être demandé sur [donc] 14 sept.. 112011-09-14 18:41:26

5

Il vous manque un lien entre les prix et les articles.

Votre jointure implicite dans la clause where joint uniquement les fournisseurs et les prix, de sorte que vous obtenez une jointure cartésienne pour le résultat de cette jointure et la table des éléments.Si vous aviez utilisé des mots clés ANSI JOIN à la place, vous auriez remarqué immédiatement

Vous avez besoin de quelque chose comme ça:

select distinct items.name, 
       vendors.name, 
       prices.url, 
       prices.price 
    FROM vendors
     JOIN prices ON vendors.vid = prices.vid 
     JOIN items ON items.iid = prices.iid --- this part is missing
    WHERE items.iid='3' 
ORDER BY prices.price;

Je ne sais pas si la condition de jointure est correcte, car vous ne nous avez pas indiqué quelle colonne de prix contient la clé étrangère des articles.

  0

Cela fonctionne! Merci! 14 sept.. 112011-09-14 17:04:11

  0

@jgilmour Si cela fonctionne, vous pouvez accepter la réponse en cliquant sur la coche à côté d'elle. Cela indique aux futurs visiteurs que c'est la bonne solution. 29 mai. 122012-05-29 10:33:25