2016-04-30 13 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

が、私はこれでそこに途中だすべての製品を選択したいと思います

:8のカテゴリIDを持つ2とも製品のカテゴリIDを持つすべての製品を取得しますが、それはcategory.c_id = 8とcategory.c_idの両方を持っている場合、それは二度同じ製品を取得

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) 

= 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 SELECT'や 'DISTINCT COL1、COL2を選択...' –

答えて

2

すべての商品情報を一覧表示したいとします。製品を繰り返さないようにするには、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)) 

さて、あなたは参加し、いくつかの非常に便利な機能を使用することができます。

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

ありがとう!何らかの理由で、1つの製品の結果行にカテゴリと店舗を表示します。 2、8、8、2 1,2,1,2 'たとえば、1つの製品に2つのショップとカテゴリがあります。私はproduct_categoryテーブルにエントリーの写真を掲載しています...私は何か間違ったことをしています、それはそれが単一の商品のカテゴリーとお店を複製していますか? – BeniaminoBaggins

+0

これは、製品が2つの店舗に存在し、2つのカテゴリ(製品の2 x 2 = 4回の出現)に関連しているために発生します。解決方法は、group_concatにdistinctを追加することです。答えの私の編集を参照してください。 –

関連する問題