MySQL复杂的SELECT

时间:2012-02-03 02:57:32

标签: mysql sql

我有一个包含3列的MySQL表格(tbl_filters):idcatval

id& val是数字,cat是varchar。每个id都有多行。

我还有另一个包含多列的表格(tbl_info),其中包含与id id对应的tbl_filters。有一个名为name的列,这就是我正在寻找的。

我想选择与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中为只有最高值的猫制作一个列,但这是一个我宁愿避免的混乱解决方案。

2 个答案:

答案 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相同,则返回结果。

如果我错了,请随意纠正我。