我正在尝试返回数据,其中我想要来自 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 的前两个结果。所有其他结果都应该出现,但不是前两个。
关于发生了什么的任何想法?
您缺少价格和商品之间的 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)
我不知道连接条件是否正确,因为您没有告诉我们价格中的哪一列包含项目的外键。
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |