【问题标题】:Mysql how to select base on priorityMysql如何根据优先级进行选择
【发布时间】:2017-05-01 00:42:04
【问题描述】:

如何通过 joins 和 group by 或任何其他替代方法来实现这一点

标签 1:

id | data  
1  | aaa  
2  | bbb  
3  | ccc

标签 2:

id  | tab1ID | status  
101 | 1      | Y  
102 | 2      | Y  
103 | 1      | X  
104 | 2      | X  
105 | 3      | X  
106 | 1      | Z  
107 | 2      | Z  

需要的输出:

id | data | status  
1 | aaa |  Z  
2 | bbb |  Z  
3 | ccc |  X  

具有最高优先级状态的记录必须出现在结果中Z > Y > X

我想避免创建单独的表来存储优先顺序

编辑1:样本数据的变化

【问题讨论】:

    标签: mysql sql select group-by sql-order-by


    【解决方案1】:

    首先,根据列tablIDstatus 的优先级为第二个表指定行号。然后将其与第一个表连接,得到iddata 列,并只选择行号为1 的行。

    查询

    选择 t1.`id`, t1.`data`, t2.`status` 从 `tab1` t1 左连接( 选择`id`,`tab1ID`,`status`, ( @curA 时的 case `tab1ID` 然后@curRow := @curRow + 1 否则 @curRow := 1 和 @curA := `tab1ID` 结束 ) 作为 rn 从`tab2`, (选择@curRow := 0, @curA := '') r 按“tab1ID”排序,“Z”时为“状态”,然后为 1 当 'Y' 然后 2 当 'X' 然后 3 else 4 结束 )t2 在 t1.`id` = t2.`tab1ID` 其中 t2.rn = 1;

    SQL Fiddle Demo

    【讨论】:

      【解决方案2】:

      如果您想要最近的状态,那么一种方法是关联子查询:

      select t1.*,
             (select t2.status
              from tab2 t2
              where t2.tab1id = t1.id
              order by t2.id desc
              limit 1
             ) as status
      from tab1 t1;
      

      编辑:

      如果你只是想要最高的地位,使用JOINGROUP BY

      select t1.*, max(t2.status)
      from tab1 t1 left join
           tab2 t2
           on t2.tab1id = t1.id
      group by t1.id;
      

      注意:假设t1.id 是唯一的(合理的假设),ANSI 标准允许甚至支持使用select t1.*

      【讨论】:

      • 感谢@Gordon 最高优先级顺序可能会出现。我已经更改了示例数据,您可以提出解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 2012-08-08
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多