Простой оператор выбора, не возвращающий правильные данные


1

Я пытаюсь вернуть данные, где я хочу имя элемента (items.name), имя поставщика (vendors.name), URL-адрес цены (prices.url) и цену (prices.price) из трех разных таблиц (элементов, поставщиков и цен) с использованием внешнего ключа vid (идентификатор продавца) из prices.vid и vendors.vid и только показ результатов с идентификатором элемента 3 (items.iid = '3') , но я получаю результаты и от других элементов id.

Вот что таблицы выглядят следующим образом:

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

Теперь, когда я выполнить запрос:

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; 

я также цена идентификаторы 1 & 2 в моем результате, даже несмотря на то, н.о.р. (item id) равны 2, а не 3, как я хочу в запросе............

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) 

Как вы я вижу первые два результата, которые имеют iid = 2, а не 3. Все остальные должны появиться, но не первые два.

Любые идеи относительно того, что происходит?

+1

Таблица ваших предметов неправильно соединена с другими. Перепишите запрос с помощью синтаксиса ANSI, и ваша проблема станет более понятной. 14 сен. 112011-09-14 16:45:08

+1

Например: SELECT DISTINCT i.name , v.name , p.url , p.price ОТ поставщиков v INNER JOIN цены р О v.vid = p.vid INNER JOIN элементы i ON p.iid = i.iid ГДЕ i.iid = '3' ORDER BY p.price; 14 сен. 112011-09-14 16:49:52

  0

Он работает! Благодаря! 14 сен. 112011-09-14 17:04:02

+2

Это действительно должно было быть задано на [так] 14 сен. 112011-09-14 18:41:26

5

Вам не хватает JOIN между ценами и товарами.

Ваше неявное присоединение к предложению where присоединяется к поставщикам и ценам, поэтому вы получаете декартовое соединение для результата этого соединения и таблицы элементов. Если вы использовали ANSI JOIN ключевых слов вместо этого, вы бы заметили, что сразу

Вам нужно что-то вроде этого:

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; 

Я не знаю, если условие соединения является правильным, потому что вы не сделали сообщите нам, какой столбец в ценах содержит внешний ключ для товаров.

  0

Это работает! Благодаря! 14 сен. 112011-09-14 17:04:11

  0

@jgilmour Если это работает, вы можете принять ответ, нажав галочку рядом с ним. Это указывает будущим посетителям, что это правильное решение. 29 май. 122012-05-29 10:33:25