[英]MySQL apply filter on joined table
假設我們有一個包含物理長方體(定義為對象)的數據庫。 每個對象都有一個長度,寬度和高度。 如下例所示。
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;
您必須將3個維度中的較小者與3個值中的較小者進行比較,將最大維度與3個值中的最大值進行比較,將中間一個與3個值的中間進行比較:
select o.id
from object o inner join dimensions d
on o.dimension_value_id = d.id
group by o.id
having
min(d.value) < least(251, 251, 350)
and
max(d.value) < greatest(251, 251, 350)
and
max(case when o.dimension = 'length' then d.value end) +
max(case when o.dimension = 'width' then d.value end) +
max(case when o.dimension = 'height' then d.value end) -
(min(d.value) + max(d.value)) <
(251 + 251 + 350) - (least(251, 251, 350) + greatest(251, 251, 350))
參見演示 。
簡化版本用於傳遞參數,如251, 251, 350
:
select o.id
from object o inner join dimensions d
on o.dimension_value_id = d.id
cross join (select 251 as col1, 251 as col2, 350 as col3) t
group by o.id
having
min(d.value) < least(max(t.col1), max(t.col2), max(t.col3))
and
max(d.value) < greatest(max(t.col1), max(t.col2), max(t.col3))
and
max(case when o.dimension = 'length' then d.value end) +
max(case when o.dimension = 'width' then d.value end) +
max(case when o.dimension = 'height' then d.value end) -
(min(d.value) + max(d.value)) <
(max(t.col1) + max(t.col2) + max(t.col3)) - (
least(max(t.col1), max(t.col2), max(t.col3)) +
greatest(max(t.col1), max(t.col2), max(t.col3))
)
參見演示 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.