从多个项目中选择最小/最大值

时间:2013-02-05 19:14:01

标签: mysql minmax

我会尝试尽可能简单地解释它:

首先是一些带有虚拟数据的数据库结构。

结构

tb_spec_fk

feature     value
-----------------
1           1
1           2
1           3
1           4
1           5
2           2
2           3
3           1
3           4
4           2
4           3
4           4
5           1
5           3
5           5
6           3
6           5

tb_spec_feature

feature_id  filter
------------------
1           2
2           2
3           2
4           2
5           1
6           0

tb_spec_value

value_id    name
----------------
1           10
2           20
3           30
4           40
5           50

现在,我想要的是以下结果

结果

feature_id  min_value   max_value
---------------------------------
1           10          50
2           20          30
3           10          40
4           20          40

但是怎么样?

逻辑

从tb_spec_feature获取,其中“filter”等于2表示tb_spec_value表中存在的最高值和最低值,并通过tb_spec_fk表连接在一起。

我的尝试

很多!但我会饶恕你:)。

2 个答案:

答案 0 :(得分:2)

SELECT
    f.feature_id AS feature_id,
    MAX(value.name) AS max_value,
    MIN(value.name) AS min_value
FROM tb_spec_feature AS f
    JOIN tb_spec_fk AS fk ON f.feature_id=fk.feature
    JOIN tb_spec_value AS value ON fk.value=value.id
WHERE f.filter=2
GROUP BY f.feature_id

两个JOIN语句将一个要素“链接”到一个值。 GROUP BY对具有相同功能ID的所有行进行分组,然后您可以在这些列上使用min或max或任何其他聚合函数。

Demo

答案 1 :(得分:0)

以下是如何做到这一点

select 
    tsf.feature_id,
    tsvl.name as Min_Value,
    tsvr.name as Max_Value
from tb_spec_feature as tsf
inner join (select feature , MIN(value) MinV,MAX(value)MaxV from tb_spec_fk group by feature order by feature)as tsfkl on tsfkl.feature = tsf.feature_id
left join tb_spec_value as tsvl on tsvl.value_id = tsfkl.MinV
left join tb_spec_value as tsvr on tsvr.value_id = tsfkl.MaxV
where tsf.filter = 2
group by tsf.feature_id

输出

feature_id  | Min_Value | Max_Value
---------------------------------
1           |   10      |   50
2           |   20      |   30
3           |   10      |   40
4           |   20      |   40

Fiddle Demo