सरल चयन कथन सही डेटा नहीं लौटा रहा है


1

मैं डेटा वापस करने की कोशिश कर रहा हूं, जहां मुझे 3 अलग-अलग तालिकाओं से आइटम का नाम (items.name), विक्रेता का नाम (seller.name), कीमत का url (price.url), और कीमत (price.price) चाहिए। आइटम, विक्रेताओं और कीमतों) की कीमतों से विदेशी कुंजी vid (विक्रेता आईडी) का उपयोग करके। vid और seller.vid और केवल आइटम आईडी 3 (आइटम.iid = '3') के साथ परिणाम दिखा रहे हैं, फिर भी मुझे अलग-अलग आइटम आईडी के परिणाम मिलते हैं कुंआ।

यहाँ तालिकाओं की तरह दिखता है:

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;

मुझे अपने परिणाम में मूल्य आईडी का 1 और 2 भी मिलता है, हालांकि आईआईडी (आइटम आईडी) 2 और 3 नहीं है जैसा कि मैं क्वेरी में चाहता हूं .... आउटपुट नीचे:

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)

जैसा कि आप देख सकते हैं, मुझे पहले दो परिणाम मिल रहे हैं जिनके पास iid = 2 है, न कि 3. बाकी सभी प्रकट होने चाहिए, लेकिन पहले दो नहीं।

क्या हो रहा है के रूप में किसी भी विचार?

+1

आपकी आइटम तालिका सही ढंग से दूसरों से नहीं जुड़ी है।ANSI सिंटैक्स का उपयोग करके अपनी क्वेरी पुनः लिखें और आपकी समस्या स्पष्ट हो जाएगी। 14 sep. 112011-09-14 16:45:08

+1

उदाहरण के लिए: DISTINCT i.name, v.name, p.url, p.price विक्रेताओं से सेलेक्ट करें V INvIN में मूल्य शामिल हैं। iid = '3' ORDER BY p.price; 14 sep. 112011-09-14 16:49:52

  0

यह काम करता हैं!धन्यवाद! 14 sep. 112011-09-14 17:04:02

+2

यह वास्तव में [पर] पूछा जाना चाहिए था 14 sep. 112011-09-14 18:41:26

5

आपको कीमतों और वस्तुओं के बीच एक JOIN याद आ रही है।

आपका निहितार्थ उस खंड में शामिल हो जाता है, जहाँ खंड केवल विक्रेताओं और कीमतों में शामिल हो जाता है, इसलिए आपको उस जोड़ और आइटम तालिका के परिणाम के लिए कार्टेसियन जॉइन मिलता है।यदि आपने इसके बजाय 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