如何在SQL查询中选择最高列值,如果另一列等于某个字符串

时间:2014-07-27 14:16:40

标签: php mysql sql

我正在尝试设置一个匹配系统,用于选择两个不同查询的最高值。我查看了网站上的其他答案,他们没有帮助。我基本上想要比较的是:

我想从version等于type的列中获取最高值,例如“type1”。我还想从version列中获取type等于“type2”的最高值。然后,我想将这些与PHP进行比较,并找出type2的{​​{1}}是否高于version的{​​{1}}。有没有办法可以做到这一点?

编辑: Brian Demilia已经回答了这个问题。主持人可以将其标记为已回答吗?

2 个答案:

答案 0 :(得分:2)

我相信这会做你想要的:

select version, type
  from tbl
 where version =
       (select max(version) from tbl where type in ('type1', 'type2'))

如果max(版本)与type1记录关联,则类型结果列将显示'type1';如果max(版本)与type2记录关联,则类型结果列将显示'type2'。

如果您想知道type1的最高版本和type2的最高版本(例如,您希望将值返回到输出中),并让查询识别哪一个更高,则可以使用以下内容:< / p>

select t1.version as type1_max_version,
       t2.version as type2_max_version,
       case when t1.version > t2.version
            then t1.version
            else t2.version end as highest_version_num,
       case when t1.version > t2.version
            then 'type1'
            else 'type2' end as highest_version_type
  from tbl t1
 cross join tbl t2
 where t1.version = (select max(version) from tbl where type = 'type1')
   and t2.version = (select max(version) from tbl where type = 'type2')

根据您的评论,如果您只想过滤那些名为“usrips”的字段具有特定值的行,则可以使用以下内容。这也假定您要将此过滤器应用于type1和type2行。如果情况不是这样,请告诉我。此外,如果要在WHERE子句中执行其他字段,则还需要将它们添加到t1和t2之间的JOIN子句中,否则您必须重复WHERE子句中的所有内容两次,一次用于t1和一次对于t2

select t1.version as type1_max_version,
       t2.version as type2_max_version,
       case when t1.version > t2.version
            then t1.version
            else t2.version end as highest_version_num,
       case when t1.version > t2.version
            then 'Firewall'
            else 'FBypass' end as highest_version_type
  from tbl t1
  join tbl t2 on t1.usrips = t2.usrips
 where t1.version = (select max(version) from tbl
                      where type = 'Firewall' and usrips LIKE '%1.1.1.1%')
   and t2.version = (select max(version) from tbl
                      where type = 'FBypass'  and usrips LIKE '%1.1.1.1%')
   and t1.usrips LIKE '%1.1.1.1%'

请参阅小提琴:http://sqlfiddle.com/#!2/2525a/7/0

答案 1 :(得分:1)

这是你想要的吗?

select max(case when t.type = 'type1' then version end) as type1_maxversion
       max(case when t.type = 'type2' then version end)  as type2_maxversion
from table t;

您可以在SQL中进行比较,最简单的方法是使用子查询:

select (case when type1_maxversion is null then 'No Type1'
             when type2_maxversion is null then 'No Type2'
             when type1_maxversion > type2_maxversion then 'Type1 Bigger'
             when type2_maxversion > type1_maxversion then 'Type2 Bigger'
             else 'equal'
        end) as comp
from (select max(case when t.type = 'type1' then version end) as type1_maxversion
             max(case when t.type = 'type2' then version end)  as type2_maxversion
      from table t
     ) x;
相关问题