Semplice istruzione select che non restituisce dati corretti


1

Sto cercando di restituire i dati, dove voglio il nome dell'oggetto (items.name), il nome del venditore (vendors.name), l'url del prezzo (prices.url) e il prezzo (prices.price) da 3 diversi tavoli (articoli, venditori e prezzi) utilizzando il vid della chiave esterna (ID fornitore) da prices.vid e vendors.vid e mostrando solo i risultati con l'ID articolo 3 (items.iid = '3'), tuttavia ottengo risultati da ID di elementi diversi come bene.

Ecco come appaiono i tavoli:

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

Ora quando eseguo la query:

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;

Ottengo anche il 1 e 2 del prezzo ID nel mio risultato anche se iid (item id) sono 2 e non 3 come voglio nella query .... Output below:

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)

Come puoi vedere, sto ottenendo i primi due risultati che hanno iid = 2, non 3. Tutto il resto dovrebbe apparire, ma non quei primi due.

Qualche idea su cosa sta succedendo?

+1

La tabella degli articoli non è correttamente unita agli altri.Riscrivi la tua query usando la sintassi ANSI e il tuo problema diventerà più chiaro. 14 set. 112011-09-14 16:45:08

+1

Ad esempio: SELECT DISTINCT i.name, v.name, p.url, p.price FROM venditori v prezzi INTERNO JOIN p ON v.vid = p.vid INNER JOIN elementi i ON p.iid = i.iid WHERE i. iid = '3' ORDINA PER prezzo; 14 set. 112011-09-14 16:49:52

  0

Funziona!Grazie! 14 set. 112011-09-14 17:04:02

+2

Questo in realtà avrebbe dovuto essere chiesto a [così] 14 set. 112011-09-14 18:41:26

5

Ti manca un JOIN tra prezzi e articoli.

Il tuo coinvolgimento implicito nella clausola where si unisce solo a venditori e prezzi, quindi ottieni un join cartesiano per il risultato di tale join e la tabella degli articoli.Se avessi usato invece le parole chiave ANSI JOIN, lo avresti notato immediatamente

Hai bisogno di qualcosa del genere:

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;

Non so se la condizione di join sia corretta, perché non ci hai detto quale colonna dei prezzi contiene la chiave esterna per gli articoli.

  0

Funziona!Grazie! 14 set. 112011-09-14 17:04:11

  0

@jgilmour Se funziona, puoi accettare la risposta facendo clic sul segno di spunta accanto ad essa.Questo indica ai visitatori futuri che è la soluzione corretta. 29 mag. 122012-05-29 10:33:25