我有这张表:
users
id|name
1|luke
2|john
3|paul
verifications
id|user_id|points|deleted_at
1|1|10|null
2|2|20|null
3|3|30|1-1-2017
目标是让所有用户按verify.points排序,但如果验证未被软删除则考虑验证点,否则使用null作为验证点。 有了这个查询:
select users.name from users
left join verifications on verifications.user_id = users.id
where verifications.deleted_at is null
ORDER BY verifications.id
我得到了这个结果:
luke (10 ponts)
john (20 points)
但我想要
paul (null points because left join)
luke (10 ponts)
john (20 ponts)
不应考虑保密验证中的30分,因为验证是软删除的,我们应该按顺序使用null作为验证点。
任何想法?
PS:我想要一个没有子查询的解决方案。
答案 0 :(得分:2)
您可以取消where
并在加入条件中检查deleted_at
。
select u.name, v.points from users u
left join verifications v on v.user_id = u.id and v.deleted_at is null
ORDER BY v.points
答案 1 :(得分:1)
如果where
有值,只需删除case
条件并使用null
表达式显示deleted_at
点。
select u.name,case when v.deleted_at is null then v.points end as points
from users u
left join verifications on v.user_id = u.id