问题描述
公司的这个查询需要优化,不知道这段逻辑应该怎么写...简化模型如下:t表 有 a b c 三个字段原sql为:select * from twhere a = "配送"and b = 2unionselect * from twhere a = "收款"and c =2能用一个select 语句搞定吗?应用中表达的意思就是查询出来配送或者收款到达2这个阶段的订单望大神不腻赐教 问题补充:除此之外的 相同的查询条件大概有10来个,用 or的话貌似不太好吧,太多重复代码
解决方案
300万只能是小表,随便哪个数据库都可以用or来完成,楼主多虑了。
解决方案二:
如果能够保证“配送”和“收款”没有重复记录的话,使用Union All效率会高些:select * from t where a = "配送" and b = 2 union allselect * from t where a = "收款" and c =2
解决方案三:
数据少的话无所谓,or可能简单明了300W条那应该是union效率高吧,or不走索引了,union每次单独查询可以走索引。具体时间自己对比下,个人觉得union效率高
解决方案四:
还有一个办法就是冗余状态,把你想要快捷查询出结果的状态,在增改时就写入额外的字段,这样只需要差一个字段,比如EX_STATUS:0,未收款并且b=1,c=11,已收款并且b=1,c=1。。。以此类推,可以在程序端写代码,也可以用触发器,这个其实是不太推荐的,复合状态并不应该是对象的直接属性。对数据库也不是非常擅长。。。
解决方案五:
select * from twhere (a = "配送"and b = 2) or (a = "收款"and c =2 )
解决方案六:
select * from t where (a = '配送' and b = 2) or (a = '收款' and c =2)