2016-04-30 16 views
5

MySQL से 3 अलग-अलग उत्पादों का चयन करें।MySQL 3 टेबल

मैं इन 5 टेबल है:

CREATE TABLE `category` (
    `c_id` int(6) NOT NULL AUTO_INCREMENT, 
    `name` varchar(40) NOT NULL, 
    PRIMARY KEY (c_id) 
); 

CREATE TABLE `product` (
    `p_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(40) NOT NULL, 
    `brand` varchar(30) NOT NULL, 
    `image_path` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (p_id) 
); 

CREATE TABLE `shop` (
    `s_id` int(6) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `country` varchar(30) NOT NULL, 
    `province` varchar(30) NOT NULL, 
    `city` varchar(30) NOT NULL, 
    `suburb` varchar(30) NOT NULL, 
    `street` varchar(40) DEFAULT NULL, 
    `streetNumber` varchar(40) DEFAULT NULL, 
    `postalCode` int(4) DEFAULT NULL, 
    PRIMARY KEY (s_id) 
) ; 

CREATE TABLE product_category (
p_id INT NOT NULL, 
c_id INT NOT NULL, 
PRIMARY KEY (p_id, c_id), 
FOREIGN KEY (p_id) REFERENCES Product(p_id) ON UPDATE CASCADE, 
FOREIGN KEY (c_id) REFERENCES Category(c_id) ON UPDATE CASCADE 
); 

CREATE TABLE product_shop (
p_id INT NOT NULL, 
s_id INT NOT NULL, 
PRIMARY KEY (p_id, s_id), 
FOREIGN KEY (p_id) REFERENCES product(p_id) ON UPDATE CASCADE, 
FOREIGN KEY (s_id) REFERENCES shop(s_id) ON UPDATE CASCADE 
); 

असल में, एक उत्पाद कई श्रेणियों हो सकता है। एक श्रेणी को कई उत्पादों को सौंपा जा सकता है। एक दुकान में कई उत्पाद हो सकते हैं। एक उत्पाद कई दुकानों में हो सकता है।

मैं सभी उत्पादों जहां category.c_id = 2, या category.c_id = 8 और shop.s_id = 1 या shop.s_id = 2.

मैं भाग रास्ता इस के साथ कर रहा हूँ चयन करना चाहते हैं :

select * 
from product inner join product_category 
on product_category.p_id=product.p_id 
where (product_category.c_id=2) 
or (product_category.c_id=8) 

कि सभी उत्पादों 8 की एक श्रेणी आईडी के साथ 2 और भी उत्पादों की एक श्रेणी आईडी है कि हो जाता है, लेकिन यह एक ही उत्पाद में दो बार हो जाता है अगर यह है दोनों category.c_id = 8 और category.c_id = 2.

फिर मैंने इसे अद्वितीय उत्पाद बनाने के लिए प्रयास किया:

select DISTINCT(product.p_id) as product 
from product inner join product_category 
on product_category.p_id=product.p_id 
where (product_category.c_id=2) 
or (product_category.c_id=8) 

जो अब विशिष्ट है लेकिन उत्पाद या श्रेणी के बारे में पर्याप्त जानकारी नहीं दिखाता है। मैं प्रत्येक पंक्ति में जितना संभव हो उतना जानकारी दिखाना चाहता हूं।

और अगले कदम के लिए केवल लोगों को पाने के लिए वह जगह है जहाँ shop.s_id = 1 या shop.s_id = 2.

किसी को भी मदद कर सकते हैं मुझे वहाँ पाने या करीब? धन्यवाद!

+0

कोशिश 'DISTINCT * का चयन करें' या 'DISTINCT col1, col2 का चयन करें ...' –

उत्तर

2

मान लें कि आप सभी उत्पाद जानकारी सूचीबद्ध करना चाहते हैं। यदि आप उत्पादों को दोहराना नहीं चाहते हैं, तो आप इन खंड का उपयोग कर सकते हैं।

select p.* 
from product p 
where p.p_id in (select c.p_id from product_category c where c.c_id in (2,8)) 
    and p.p_id in (select s.p_id from product_shop s where s.s_id in (1,2)) 

अब, आप सभी उत्पाद डेटा और सूची जो श्रेणियों और दुकानों उत्पाद से संबंधित है चाहते हैं, तो आप में शामिल होने और कुछ बहुत आसान कार्यों का उपयोग कर सकते हैं।

select p.p_id, p.`name`, p.brand, GROUP_CONCAT(DISTINCT c.c_id SEPARATOR ', ') as categories, GROUP_CONCAT(DISTINCT s.s_id SEPARATOR ', ') as shops 
from product p inner join product_category c on p.p_id = c.p_id 
       inner join product_shop s on p.p_id = s.p_id 
where c.c_id in (2,8) 
    and s.s_id in (1,2) 
group by p.p_id, p.`name`, p.brand 
+0

धन्यवाद! किसी कारण से यह श्रेणियों और दुकानों के लिए एक उत्पाद की परिणाम पंक्ति में प्रदर्शित करता है: 2, 8, 8, 2 1, 2, 1, 2' उदाहरण के लिए इसमें एक उत्पाद के लिए डुप्लिकेट दुकानें और श्रेणियां हैं। मैंने अपनी product_category तालिका में प्रविष्टियों की एक तस्वीर पोस्ट की है ... क्या मैं वहां कुछ गलत कर रहा हूं, जो इसे एक ही उत्पाद की श्रेणियों और दुकानों को डुप्लिकेट कर रहा है? – BeniaminoBaggins

+0

ऐसा इसलिए होता है क्योंकि उत्पाद 2 दुकानों में मौजूद है और 2 श्रेणियों से संबंधित है: उत्पाद की 2 x 2 = 4 घटनाएं। समाधान group_concat पर अलग जोड़ना है। उत्तर पर मेरा संपादन देखें। –

संबंधित मुद्दे