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

2023-12-19

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 的那些。

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


假设您要列出所有产品信息。如果不希望产品重复,可以使用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 从 3 个表中选择不同的产品 的相关文章

随机推荐

  • 通知中的音乐播放器控制

    如何在 Android 中设置带有播放 暂停 下一个和上一个按钮的通知 我是 Android 新手 也是堆栈溢出新手 所以请耐心听我说 我设置了歌曲开始播放时的通知 如下所示 SuppressLint NewApi public void
  • MemoryError - 如何使用 Python 通过 Google Drive SDK 下载大文件

    从 Google 云端硬盘下载大文件时 我的内存不足 我假设tmp content read 1024 不起作用 但如何解决呢 谢谢 def download file service file id drive file service
  • bat文件中设置cygwin环境变量

    我需要设置几个应该在 cygwin shell 中可用的环境变量 我尝试跑步 c Program Files x86 Microsoft Visual Studio 10 0 VC bin amd64 vcvars64 bat在 bashr
  • 如何检测zstd压缩?

    我目前正在开发一个 python 应用程序 它可以与 facebook api 一起使用 众所周知 facebook热爱自己的技术 正在与zstd合作进行数据压缩 问题 facebook 要么返回带有正常 json 的未压缩响应 要么如果响
  • 如何获取sql作业中step1到step2的值

    我需要创建一个 SQL 作业 Step1 在 TaskToProcess 表中插入一行并返回 ProcessID PK 和 Identity Step2 检索生成的进程 IDstep1并将值传递给 SSIS 包并执行 SSIS 包 这在 S
  • 有没有可以在 Mono 上运行的 F# IDE?

    我在 Mac 上使用 F 我想知道 kbow 是否有任何可以在单声道 不是通用编辑器 上工作的 F IDE 似乎有一个MonoDelvelop 插件 http artwild blogspot com 2008 08 f addin for
  • 使用 _* 的 varargs 的 Scala 类型归属导致错误

    我对 Scala 可变参数有一个初步的了解 接受可变参数的方法的参数需要hint它是一个 varargs 使用 使用Scala 2 10 3 我定义了以下两个方法 scala gt def method varargs Int more S
  • Qt QCalendarWidget QSS 样式

    我知道没有人支持QCalendarWidget QSS样式 但有人知道一些更改部分颜色的解决方法1 and 2 of the QCalendarWidget 浅蓝色部分1白色部分2 Thanks 我已经检查过QCalendarWidget
  • 升级到 2021-06 (4.20.0) 后,Eclipse 内容辅助循环失败

    有人问了类似的问题here https stackoverflow com questions 68199554 content assist cannot find proposals in loop if there is code b
  • 如何在 Delphi 中输入分数?

    我有一个应用程序将使用测量值 特别是小至 1 16 英寸 我真的想要一种方便的方式让最终用户输入包含小数部分的值 例如 3 7 16 我意识到我可以要求用户只输入十进制值 即 3 1875 但我真的想要一种更好的方法 有谁知道可以轻松输入的
  • 从 ArrayList 中删除所有出现的元素

    我在用java util ArrayList 我想删除所有出现的特定元素 List
  • 检索 Dynamics 2011 中的选项集

    我正在使用此代码来检索全局选项集 var request new RetrieveOptionSetRequest Name OptionsetNameGoesHere var retrieveOptionSetResponse Retri
  • 在 eclipse 中使用 mahout 而不使用 Maven

    我真的不想使用maven 因为它看起来很麻烦 有没有办法只下载 mahout 并在我的 eclipse 项目中使用它 我从使用 Maven 得到的只是构建路径错误和数百万条警告 我一直在寻找一种方法来做到这一点 但人们似乎一直都在使用 Ma
  • 四舍五入至小数点后两位

    Math round doubleValue 100 100 0 有没有更好的方法将小数四舍五入到小数点后两位 如果您对小数位以及精确的小数值感兴趣 您通常应该使用java math BigDecimal http download ora
  • Zend 实例随机丢失

    我有一个在 zend 上运行的网站 最近它表示登录时会丢失会话变量 auth Zend Auth getInstance 有时似乎不起作用任何线索可能是什么问题 None
  • Realm 中具有惰性属性的复合键

    我发现了在 Swift 中使用带有复合主键的 Realm 的绝佳解决方案 https github com realm realm cocoa issues 1192 https github com realm realm cocoa i
  • 构建过程中ASP.NET Core设置托管环境

    我有一个ASP NET Core Api我在其中使用 appsettings environmentname json 配置文件 然后 我还有带有不同环境选项的相应 launchSettings json 文件 以便我可以使用任何特定的环境
  • 设计模式或代码味道,功能分解导致的非规范化数据

    我是以下的忠实粉丝http highscalability com http highscalability com 并且一直在我当前的开发中沿着功能边界分解我的应用程序 作为能够扩展服务器端 特别是数据库层 的途径 这涉及到将应用程序的不
  • 在 Reporting Services 中向条形图添加趋势线

    如何在 Reporting Services 2005 中向条形图添加趋势线 您必须从数据源创建趋势线的数据 从图表属性的数据选项卡上 选择趋势数据系列 单击编辑 然后在 编辑图表值 对话框中选择 外观 选项卡 选中 将数据绘制为线 框 使
  • MySQL 从 3 个表中选择不同的产品

    MySQL 从 3 个表中选择 我有这 5 个表 CREATE TABLE category c id int 6 NOT NULL AUTO INCREMENT name varchar 40 NOT NULL PRIMARY KEY c