Ben*_*ins 5 mysql select inner-join distinct
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
);
Run Code Online (Sandbox Code Playgroud)
基本上,产品可以有许多类别.可以为许多产品分配类别.一家商店可以有很多产品.一个产品可以在许多商店.
我想选择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)
Run Code Online (Sandbox Code Playgroud)
这将获得类别ID为2的所有产品以及类别ID为8的产品,但如果它同时包含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)
Run Code Online (Sandbox Code Playgroud)
现在哪个不同但没有显示有关产品或类别的足够信息.我希望在每一行中尽可能多地显示信息.
下一步是只获取shop.s_id = 1或shop.s_id = 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))
Run Code Online (Sandbox Code Playgroud)
现在,如果您想要所有产品数据并列出该产品与哪些类别和商店相关,那么您可以使用 join 和一些非常方便的功能。
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
Run Code Online (Sandbox Code Playgroud)