Declaración de selección simple que no devuelve datos correctos


1

Estoy intentando devolver datos, donde deseo el nombre del artículo (items.name), el nombre del proveedor (vendors.name), la url del precio (prices.url) y el precio (prices.price) de 3 tablas diferentes (artículos, proveedores y precios) utilizando el vid de clave foránea (ID de proveedor) de prices.vid y vendors.vid y solo muestra resultados con el ID de artículo 3 (items.iid = '3'), pero obtengo resultados de diferentes ID de artículo como bien.

Aquí es cómo se ven las tablas:

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 |
+-----+-------+--------------------------------------------------------------------------------------+-----+-----+

Ahora cuando ejecuto la consulta:

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;

También obtengo los ID de precio 1 y 2 en mi resultado, aunque los iid (ID de artículo) son 2 y no 3 como quiero en la consulta ... Salida a continuación:

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)

Como puede ver, estoy obteniendo los dos primeros resultados que tienen iid = 2, no 3. Todo el resto debería aparecer, pero no esos dos primeros.

¿Alguna idea sobre qué está pasando?

+1

Tu tabla de artículos no está correctamente unida a las otras.Reescriba su consulta usando la sintaxis ANSI y su problema se aclarará. 14 sep. 112011-09-14 16:45:08

+1

Por ejemplo: SELECT DISTINCT i.name, v.name, p.url, p.price DE vendedores v INNER JOIN precios p ON v.vid = p.vid INNER JOIN elementos i ON p.iid = i.iid DONDE i. iid = '3' ORDEN POR p.price; 14 sep. 112011-09-14 16:49:52

  0

¡Funciona!¡Gracias! 14 sep. 112011-09-14 17:04:02

+2

Esto realmente debería haber sido preguntado en [así que] 14 sep. 112011-09-14 18:41:26

5

Te estás perdiendo una ÚNETE entre precios y artículos.

Su unión implícita en la cláusula where solo se une a proveedores y precios, por lo que obtiene una unión cartesiana para el resultado de esa unión y la tabla de elementos.Si hubiera usado palabras clave ANSI JOIN en su lugar, lo habría notado de inmediato.

Necesitas algo como esto:

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;

No sé si la condición de unión es correcta, porque no nos dijo qué columna en los precios contiene la clave externa para los artículos.

  0

¡Funciona!¡Gracias! 14 sep. 112011-09-14 17:04:11

  0

@jgilmour Si funciona, puede aceptar la respuesta haciendo clic en la marca de verificación junto a ella.Esto indica a los futuros visitantes que es la solución correcta. 29 may. 122012-05-29 10:33:25