我有一个包含3列的MySQL表格(tbl_filters
):id
,cat
,val
id
& val
是数字,cat
是varchar。每个id都有多行。
我还有另一个包含多列的表格(tbl_info
),其中包含与id
id
对应的tbl_filters
。有一个名为name
的列,这就是我正在寻找的。 p>
我想选择与cat
的设定值匹配的所有行的名称,但前提是val
的{{1}}是此ID的最大值,且仅如果它高于最小集合cat
。
在伪代码中,它将类似于:
val
示例:
SELECT tbl_info.name FROM tbl_info,tbl_filters
WHERE (tbl_info.id=tbl_filters.id) AND (cat="mycat") AND (val>=0.3)
AND (there are no other rows for this id in tbl_info with a higher value for val)
在上面的示例中,只有在我查找名为eg3的tbl_filters
id,cat,val
1 eg1 0.43
1 eg2 0.60
1 eg3 0.78
tbl_info
id name
1 MyName
时才应返回值,因为它具有最高值。对于其他猫,不应返回任何东西,因为它们不是最高值。
另一种选择是在cat
中为只有最高值的猫制作一个列,但这是一个我宁愿避免的混乱解决方案。
答案 0 :(得分:2)
我认为我正在关注您... INNER-MOST查询预先确定了您的最低价格资格的每个ID的最高价值以及符合条件的类别。 ONCE你得到那个列表,重新加入以从tbl_info获取名称。我已经第二次重新加入tbl_filters,以防你想要的那个记录上有其他元素,例如费率的日期或其他东西。如果您不需要,可以忽略第二个“tf2”连接,只需将字段列表从tf2.val更改为PreQualified.HighestQualVal。
select
ti.id,
ti.name,
tf2.val
from
( select
tf.id,
max( tf.val ) as HighestQualVal
from
tbl_filters tf
where
tf.cat = "mycat"
and tf.val >= 0.3
) PreQualified
JOIN tbl_info ti
on PreQualified.id = ti.id
JOIN tbl_filters tf2
on PreQualified.id = tf2.id
AND PreQualified.HighestQualVal = tf2.val
答案 1 :(得分:0)
怎么样?
select ti.name, MaxId.maxVal from
(select tf1.id, tf1.cat, max(tf1.val) as maxVal from tbl_filters1 tf1
where tf1.cat = 'eg3' and tf1.val >= 0.0
group by tf1.id, tf1.cat) MaxCat
inner join (
select tf2.id, max(tf2.val) as maxVal from tbl_filters2 tf2
group by tf2.id) MaxId
on (MaxCat.id = MaxId.id and MaxCat.maxVal = MaxId.maxVal)
inner join tbl_info ti on MaxId.id = ti.id
示例here
基本上,如果我没错(再次),我将获得每个id和cat对的所有最大值。然后获取每个id的最大值。如果两者都匹配,即如果cat的max与整个id的max相同,则返回结果。
如果我错了,请随意纠正我。