2016-04-30 25 views
5

MySQL chọn từ 3 bảng.MySQL chọn các sản phẩm riêng biệt từ 3 bảng

Tôi có những 5 bảng:

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 
); 

Về cơ bản, một sản phẩm có thể có nhiều loại. Một thể loại có thể được gán cho nhiều sản phẩm. Một cửa hàng có thể có nhiều sản phẩm. Một sản phẩm có thể ở nhiều cửa hàng.

Tôi muốn chọn tất cả các sản phẩm mà các category.c_id = 2, hoặc category.c_id = 8 và shop.s_id = 1 hoặc shop.s_id = 2.

Tôi là một phần con đường đó với điều này :

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) 

đó được tất cả các sản phẩm mà có một id chủng loại 2 và cũng sản phẩm với một id chủng loại 8, nhưng nó được sản phẩm tương tự hai lần nếu nó có cả category.c_id = 8 và category.c_id = 2.

Sau đó, tôi đã thử cách này để làm cho sản phẩm độc đáo:

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) 

Điều này giờ đây khác biệt nhưng không hiển thị đủ thông tin về sản phẩm hoặc danh mục. Tôi muốn hiển thị càng nhiều thông tin càng tốt trong mỗi hàng.

Và bước tiếp theo là để chỉ nhận được những cái nơi shop.s_id = 1 hoặc shop.s_id = 2.

bất cứ ai có thể giúp tôi đạt được điều đó hoặc nhận được gần gũi hơn? Cảm ơn!

+0

thử 'CHỌN DISTINCT *' hoặc 'CHỌN DISTINCT col1, col2 ...' –

Trả lời

2

Giả sử bạn muốn liệt kê tất cả thông tin sản phẩm. Nếu bạn không muốn các sản phẩm lặp lại, bạn có thể sử dụng mệnh đề IN.

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

Bây giờ, nếu bạn muốn tất cả dữ liệu sản phẩm và danh mục liên quan đến sản phẩm và cửa hàng, bạn có thể sử dụng và một số chức năng rất tiện dụng.

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

Cảm ơn! Vì lý do nào đó, nó hiển thị điều này trong hàng kết quả của một sản phẩm, cho các danh mục và cửa hàng: 2, 8, 8, 2 1, 2, 1, 2' ví dụ: cửa hàng và danh mục trùng lặp cho một sản phẩm. Tôi đã đăng một bức ảnh của các mục trong bảng product_category của tôi ... Tôi đang làm điều gì đó sai ở đó, đó là làm cho nó trùng lặp một loại sản phẩm duy nhất và cửa hàng? – BeniaminoBaggins

+0

Điều này xảy ra vì sản phẩm có mặt tại 2 cửa hàng và có liên quan đến 2 loại: 2 x 2 = 4 lần xuất hiện của sản phẩm. Giải pháp là để thêm riêng biệt trên group_concat. Xem chỉnh sửa của tôi trên câu trả lời. –

Các vấn đề liên quan