簡體   English   中英

MySQL對聯接表應用過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM