Mysql 在第一个需要的地方停止

Mysql stop at first desired WHERE

假设我有这个声明:

select * from t1 join t2 on t1.id = t2.user_id where A OR B OR C ;

此查询将执行所有 where 条件,并且 return 所有这些条件都会立即得到结果。我只想得到 first where 子句的结果,其中子句的顺序是 important。我应该如何重写此查询以获得所需的结果?

如果你想对结果进行排序,那么使用order by:

select *
from t1 join
     t2
     on t1.id = t2.user_id 
where A OR B OR C
order by (case when A then 1 when B then 2 when C then 3 end);

如果您想要一行,请将 limit 1 添加到此查询中:

select *
from t1 join
     t2
     on t1.id = t2.user_id 
where A OR B OR C
order by (case when A then 1 when B then 2 when C then 3 end)
limit 1;

如果您想要多行,那么我会计算每个条件的匹配行数,并在 where:

中使用该信息
select *
from t1 join
     t2
     on t1.id = t2.user_id cross join
     (select sum(A) as num_A, sum(B) as num_B, sum(C) as num_C
      from t1 join
           t2
           on t1.id = t2.user_id 
     ) tt
where A or
      (num_A = 0 and B) or
      (num_A = 0 and num_B = 0 and C);

试试这个:

select * from t1 
join t2 on t1.id = t2.user_id 
where
CASE    WHEN EXISTS(select * from t1 join t2 on t1.id = t2.user_id where A)
            THEN A
        WHEN EXISTS(select * from t1 join t2 on t1.id = t2.user_id where B)
            THEN B
        WHEN EXISTS(select * from t1 join t2 on t1.id = t2.user_id where C)
            THEN C
        ELSE FALSE
END