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
假设我有这个声明:
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