简单的选择语句没有返回正确的数据

1 mysql join select

我正在尝试返回数据,其中我想要来自 3 个不同表 (商品、供应商和价格)使用来自价格的外键 vid(供应商 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 |
+-----+-------+--------------------------------------------------------------------------------------+-----+-----+
Run Code Online (Sandbox Code Playgroud)

现在,当我执行查询时:

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;
Run Code Online (Sandbox Code Playgroud)

即使 iid(项目 id)是 2 而不是 3,正如我在查询中想要的那样,我的结果中也得到了价格 id 的 1 和 2。输出如下:

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)
Run Code Online (Sandbox Code Playgroud)

如您所见,我得到了 iid = 2 而不是 3 的前两个结果。所有其他结果都应该出现,但不是前两个。

关于发生了什么的任何想法?

a_h*_*ame 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;
Run Code Online (Sandbox Code Playgroud)

我不知道连接条件是否正确,因为您没有告诉我们价格中的哪一列包含项目的外键。