mysql - MySQL 在连接表上应用过滤器
问题描述
假设我们有一个带有物理立方体的数据库,定义为对象。每个对象都有长度、宽度和高度。如下例所示。
CREATE TABLE dimensions(
id int PRIMARY KEY NOT NULL,
value int
);
CREATE TABLE object(
id int,
dimension VARCHAR(100),
dimension_value_id int,
FOREIGN KEY (dimension_value_id) REFERENCES dimensions(id)
);
INSERT INTO dimensions VALUES(0, 100);
INSERT INTO dimensions VALUES(1, 200);
INSERT INTO dimensions VALUES(2, 300);
INSERT INTO dimensions VALUES(3, 400);
INSERT INTO object VALUES(0, "length", 1);
INSERT INTO object VALUES(0, "width", 3);
INSERT INTO object VALUES(0, "height", 2);
INSERT INTO object VALUES(1, "length", 1);
INSERT INTO object VALUES(1, "width", 1);
INSERT INTO object VALUES(1, "height", 2);
我的目标是过滤尺寸小于 251x251x350 的对象,在示例中这将是 id 为 1 的对象。
加入表格时,我得到记录:
SELECT * FROM object o
JOIN dimensions d ON o.dimension_value_id = d.id
但是现在如何应用过滤器。我遇到了存在/不存在的解决方案。但在这种情况下,这是行不通的,因为我需要一个不存在的独占。如何做到这一点?
解决方案
您可以使用条件聚合。这看起来像:
SELECT o.id
FROM object o JOIN
dimensions d
ON o.dimension_value_id = d.id
GROUP BY o.id
HAVING MAX(CASE WHEN o.dimension = 'length' THEN d.value END)) < 350 AND
MAX(CASE WHEN o.dimension = 'width' THEN s.value END)) < 350 AND
MAX(CASE WHEN o.dimension = 'height' THEN d.value END)) < 350;
推荐阅读
- javascript - FCM:firebase getToken 选项(ServiceWorkerRegistration,vapidKey)
- javascript - 在几秒钟内使用 JavaScript 计时二进制搜索
- tableau-api - 有没有办法根据维度字符串和度量值组合有条件地突出显示列单元格?
- datatables - 仅在页面上初始化超过 1 个数据表时发生错误
- flask - 为什么 heroku 不能运行我的烧瓶应用程序。找不到属性应用程序然后输出错误代码 H10
- python - 虽然循环没有显示正确的输出
- asynchronous - 为什么 tokio::spawn 在 crossbeam_channel::select 旁边调用时会有延迟?
- python - 如何在 add_url_rule 烧瓶中使用参数
- python - 将txt转换为按列分隔的CSV
- python - rpy2 将包中的 R 符号转换为 Python 符号时发生冲突