정확한 select 문이 반환되지 않음


1

나는 항목 이름 (items.name), 공급 업체 이름 (vendors.name), 가격 url (prices.url) 및 가격 (prices.price)을 원하는 3 개의 다른 테이블에서 데이터를 반환하려고합니다. item.vid 및 vendors.vid의 foreign key vid (공급 업체 ID)를 사용하고 item id 3 (items.iid = '3')의 결과 만 표시하면서 다른 item 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;

또한 iid (item id)가 2이고 3이 아니라도 쿼리에서 원하는대로 가격 결과의 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)

보시다시피, 나는 처음 2 개의 결과를 얻고 있습니다. iid = 2, 3이 아닙니다. 나머지는 모두 나타나야합니다. 처음 두 개는 나타나지 않아야합니다.

무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

+1

항목 테이블이 다른 사람과 올바르게 결합되지 않았습니다.ANSI 구문을 사용하여 쿼리를 다시 작성하면 문제가 명확 해집니다. 14 sep. 112011-09-14 16:45:08

+1

예를 들면 다음과 같습니다. SELECT DISTINCT i.name, v.name, p.url, p.price FROM 공급 업체 v INNER JOIN 가격 p ON v.vid = p.vid INNER JOIN 항목 i on p.iid = i.iid i. iid = '3'ORDER BY p.price; 14 sep. 112011-09-14 16:49:52

  0

그것은 작동합니다!감사! 14 sep. 112011-09-14 17:04:02

+2

이것은 정말로 [so] 14 sep. 112011-09-14 18:41:26

5

가격과 품목 간의 JOIN이 누락되었습니다.

where 절의 암시 적 조인은 공급 업체와 가격 만 조인하므로 조인과 items 테이블의 결과에 대한 데카르트 조인을 얻습니다.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 sep. 112011-09-14 17:04:11

  0

@jgilmour 작동하는 경우 옆에있는 체크 표시를 눌러 대답을 수락 할 수 있습니다.이는 향후 방문자에게 올바른 해결책임을 나타냅니다. 29 may. 122012-05-29 10:33:25