Câu lệnh chọn đơn giản không trả về dữ liệu chính xác


1

Tôi đang cố gắng trả lại dữ liệu, nơi tôi muốn tên mặt hàng (items.name), tên nhà cung cấp (nhà cung cấp), url của giá (price.url) và giá (price.price) từ 3 bảng khác nhau (các mặt hàng, nhà cung cấp và giá cả) sử dụng khóa ngoại vid (id nhà cung cấp) từ price.vid và nhà cung cấp.vid và chỉ hiển thị kết quả với mục id 3 (items.iid = '3'), nhưng tôi nhận được kết quả từ các id khác nhau như tốt.

Đây là những gì các bảng trông như:

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

Bây giờ khi tôi thực hiện truy vấn:

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;

Tôi cũng nhận được giá 1 & 2 của id trong kết quả của mình mặc dù iid (id mục) là 2 chứ không phải 3 như tôi muốn trong truy vấn .... Kết quả bên dưới:

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)

Như bạn có thể thấy, tôi nhận được hai kết quả đầu tiên có iid = 2, không phải 3. Tất cả phần còn lại sẽ xuất hiện, nhưng không phải hai kết quả đầu tiên.

Bất kỳ ý tưởng như những gì đang xảy ra?

+1

Bảng mục của bạn không được nối chính xác với những người khác.Viết lại truy vấn của bạn bằng cú pháp ANSI và vấn đề của bạn sẽ trở nên rõ ràng hơn. 14 sep. 112011-09-14 16:45:08

+1

Ví dụ: CHỌN DISTINCT i.name, v.name, p.url, p.price TỪ nhà cung cấp v INNER THAM GIA giá p ON v.vid = p.vid INNER THAM GIA các mặt hàng i ON p.iid = i.iid WHERE i. iid = '3' ĐẶT HÀNG B pNG p.price; 14 sep. 112011-09-14 16:49:52

  0

Nó hoạt động!Cảm ơn! 14 sep. 112011-09-14 17:04:02

+2

Điều này thực sự nên được hỏi về [vì vậy] 14 sep. 112011-09-14 18:41:26

5

Bạn đang thiếu một THAM GIA giữa giá cả và các mặt hàng.

Tham gia ngầm định của bạn trong mệnh đề where chỉ tham gia với các nhà cung cấp và giá cả để bạn có được một tham gia cartesian cho kết quả của việc tham gia đó và bảng vật phẩm.Nếu bạn đã sử dụng từ khóa ANSI THAM GIA thay vào đó, bạn sẽ nhận thấy điều đó ngay lập tức

Bạn cần một cái gì đó như thế này:

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;

Tôi không biết điều kiện tham gia có đúng không, vì bạn đã không cho chúng tôi biết cột nào trong giá có chứa khóa ngoại đối với các mặt hàng.

  0

Nó hoạt động!Cảm ơn! 14 sep. 112011-09-14 17:04:11

  0

@jgilmour Nếu nó hoạt động, bạn có thể chấp nhận câu trả lời bằng cách nhấp vào dấu kiểm bên cạnh nó.Điều này chỉ ra cho khách truy cập trong tương lai rằng đó là giải pháp chính xác. 29 may. 122012-05-29 10:33:25