Einfache Select-Anweisung, die keine korrekten Daten zurückgibt


1

Ich versuche, Daten zurückzugeben, bei denen der Artikelname (items.name), der Lieferantenname (vendors.name), die URL des Preises (prices.url) und der Preis (prices.price) aus 3 verschiedenen Tabellen (Artikel, Lieferanten und Preise) unter Verwendung des Fremdschlüssels vid (Lieferanten-ID) von prices.vid und vendors.vid und nur mit Artikel-ID 3 (items.iid = '3') angezeigt Gut.

So sehen die Tabellen aus:

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

Wenn ich jetzt die Abfrage ausführe:

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;

Ich erhalte auch die Preis-IDs 1 & 2 in meinem Ergebnis, obwohl die ID (Artikel-ID) 2 und nicht 3 ist, wie ich es in der Abfrage möchte .... Ausgabe unten:

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)

Wie Sie sehen, erhalte ich die ersten beiden Ergebnisse mit iid = 2 und nicht 3. Der Rest sollte angezeigt werden, aber nicht die ersten beiden.

Irgendwelche Ideen, was los ist?

+1

Ihre Artikeltabelle ist nicht korrekt mit den anderen verknüpft.Schreiben Sie Ihre Abfrage mit der ANSI-Syntax neu und Ihr Problem wird klarer. 14 sep. 112011-09-14 16:45:08

+1

Zum Beispiel: SELECT DISTINCT i.name, v.name, p.url, p.price FROM vendors INNER JOIN-Preise p ON v.vid = p.vid INNER JOIN-Elemente i ON p.iid = i.iid WHERE i. iid = '3' ORDER BY p.price; 14 sep. 112011-09-14 16:49:52

  0

Es klappt!Vielen Dank! 14 sep. 112011-09-14 17:04:02

+2

Das hätte wirklich gefragt werden sollen am 14 sep. 112011-09-14 18:41:26

5

Es fehlt ein JOIN zwischen Preisen und Artikeln.

Ihre implizite Verknüpfung in der where-Klausel verknüpft nur Anbieter und Preise, sodass Sie eine kartesische Verknüpfung für das Ergebnis dieser Verknüpfung und die Artikeltabelle erhalten.Wenn Sie stattdessen ANSI JOIN-Schlüsselwörter verwendet hätten, wäre Ihnen dies sofort aufgefallen

Sie brauchen so etwas:

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;

Ich weiß nicht, ob die Join-Bedingung korrekt ist, da Sie uns nicht mitgeteilt haben, in welcher Preisspalte der Fremdschlüssel für Artikel enthalten ist.

  0

Es klappt!Vielen Dank! 14 sep. 112011-09-14 17:04:11

  0

@jgilmour Wenn es funktioniert, können Sie die Antwort akzeptieren, indem Sie auf das Häkchen daneben klicken.Dies zeigt zukünftigen Besuchern an, dass dies die richtige Lösung ist. 29 mai. 122012-05-29 10:33:25