首页 > 解决方案 > 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

但是现在如何应用过滤器。我遇到了存在/不存在的解决方案。但在这种情况下,这是行不通的,因为我需要一个不存在的独占。如何做到这一点?

标签: mysqlsqljoinfilter

解决方案


您可以使用条件聚合。这看起来像:

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;

推荐阅读