MySQL 从 3 个表中选择不同的产品

Posted

技术标签:

【中文标题】MySQL 从 3 个表中选择不同的产品【英文标题】:MySQL select distinct products from 3 tables 【发布时间】:2016-08-25 06:34:28 【问题描述】:

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)

这会获取类别 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)

现在不同了,但没有显示有关产品或类别的足够信息。我想在每一行中显示尽可能多的信息。

下一步是只获取 shop.s_id = 1 或 shop.s_id = 2 的那些。

谁能帮我到达那里或靠近点?谢谢!

【问题讨论】:

试试SELECT DISTINCT *SELECT DISTINCT col1,col2 ... 【参考方案1】:

假设您要列出所有产品信息。如果不希望产品重复,可以使用 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))

现在,如果您想要所有产品数据并列出该产品与哪些类别和商店相关,那么您可以使用 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

【讨论】:

谢谢!出于某种原因,它会在一个产品的结果行中显示这一点,对于类别和商店:2、8、8、2 1、2、1、2` 例如,它有一个产品的重复商店和类别。我已经在我的 product_category 表中发布了条目的照片......我在那里做错了什么,那就是让它重复单个产品的类别和商店? 发生这种情况是因为该产品出现在 2 家商店并且与 2 个类别相关:2 x 2 = 4 次出现该产品。解决方案是在 group_concat 上添加 distinct。请参阅我对答案的编辑。

以上是关于MySQL 从 3 个表中选择不同的产品的主要内容,如果未能解决你的问题,请参考以下文章

从 3 个表中选择,在两个 group by 之前有两个 order by

汇总SQL中2个不同表中的3列

从sql中的两个表中选择

从 2 个表中获取数据到 excel 表中

Mysql比较两个表中的两列

Mysql 从不同的表中按名称选择