Basit seçim ifadesi doğru veriyi döndürmüyor


1

3 farklı tablodan madde adını (items.name), satıcı adını (vendors.name), fiyatın url'sini (prices.url) ve fiyatı (price.price) istediğim verileri döndürmeye çalışıyorum yabancı anahtar vidini (satıcı kimliği) prices.vid ve vendors.vid'deki kullanarak öğeleri, satıcıları ve fiyatları) iyi.

Tablolar şöyle görünür:

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

Şimdi sorguyu çalıştırdığımda:

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;

Ayrıca, iid (item id) 2 ve sorguda istediğim gibi 3 olmasa da sonuçta fiyat kimliğimin 1 & 2 değerlerini alıyorum .... Çıktı:

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)

Gördüğünüz gibi, iid = 2 olan ilk iki sonucu alıyorum, 3 değil. Tüm kalanlar görünmeli ama ilk iki değil.

Neler olduğuna dair bir fikrin var mı?

+1

Öğeler tablonuz diğerlerine doğru şekilde katılmamış.Sorgunuzu ANSI sözdizimini kullanarak yeniden yazın; sorununuz daha net hale gelecektir. 14 eyl. 112011-09-14 16:45:08

+1

Örneğin: SELECT DISTINCT i.name, v.name, p.url, p.price satıcılardan p.price v INNER JOIN fiyatları p ON v.vid = p.vid INNER JOIN i ON öğeleri i. iid = '3' SİPARİŞ BY p.price; 14 eyl. 112011-09-14 16:49:52

  0

İşe yarıyor!Teşekkürler! 14 eyl. 112011-09-14 17:04:02

+2

Bu gerçekten sorulmalıydı [so] 14 eyl. 112011-09-14 18:41:26

5

Fiyatlar ve ürünler arasında bir JOIN eksik.

Örtüğünüz, yan tümce maddesinin yalnızca satıcıları ve fiyatları birleştirdiği yerdeki birleşimine katılarak, bu birleşimin sonucu ve öğe tablosu için kartezyen birleşim elde edersiniz.Bunun yerine ANSI JOIN anahtar kelimeleri kullanmış olsanız, hemen fark etmişsinizdir.

Bunun gibi bir şeye ihtiyacınız var:

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;

Katılma koşulunun doğru olup olmadığını bilmiyorum, çünkü fiyatların hangi sütununun kalemlerin yabancı anahtarını içerdiğini söylemediniz.

  0

İşe yarıyor!Teşekkürler! 14 eyl. 112011-09-14 17:04:11

  0

@jgilmour Çalışırsa, yanındaki onay işaretini tıklatarak yanıtı kabul edebilirsiniz.Bu, gelecekteki ziyaretçilere doğru çözüm olduğunu gösterir. 29 may. 122012-05-29 10:33:25