算法 就是 user 表中 有六个字段,任意符合其中两项的就提出来,逻辑怎么写

sjzg001 · 2014年07月31日 · 最后由 lifuzho 回复于 2014年08月01日 · 8067 次阅读

就是 user 表中 有六个字段,任意符合其中两项的就提出来,逻辑怎么写

select * from user where XXX=" " and YYY=" "; User.where(:XXX => " ", :YYY => " ")

User.any_of()

#1 楼 @hging 岂不是要写很多 User.where(:XXX => " ", :YYY => " ")

#1 楼 @hging 我想他的意思是这个表中有六列,只要给定的条件满足任意两列的值,则取出这个值,也就是说他不知道给定的值是哪一列的,也就是说不知道给定的是哪两列的值。

@sjzg001 我觉得这个题目不太明确,如何定义任意符合两项?是不是你的表单有六个项目,然后只要提交任意两个就好了?还是说给定一个值,测试这一个值在这六个字段中是否符合其中两项?这两种方法的解法时完全不一样的。我觉得关键点是你是否知道给定的这两项具体事哪个字段的,还是不知道呢?

#2 楼 @dddd1919 有这个用法?没有搜到啊,还是说是一个自定义的方法?

#4 楼 @chunlea 是一个值在这六个字段中是否符合其中两项

#6 楼 @sjzg001 这个太奇葩了,没想到好的解决方法,可能写 30 个 Where 是一个比较好的解决方案……我觉得你需要思考下是不是这个问题本身就不合理啊。

帖子中的描述不够详细。应该是有六个字段,各自存值。而后,有 N 条规则。这 N 条规则,只要其中任意 m 条匹配,(m < n) 就取出。

.....全 select 出来加起来看是不是大于等于 2 吧。。。

http://sqlfiddle.com/#!7/16f5f/16/0

#5 楼 @chunlea mongoid的话可以

#10 楼 @dddd1919 哦,我以为是 ActiveRecord 呢

#9 楼 @Kabie 这个数据量大了不靠谱吧。我只能想到 sql 了 (貌似更渣)。

SELECT * FROM User WHERE ((条件1 and 条件2) or (条件1 and 条件3) or ......)

30 个啊,好像很渣。

如果换一种方式,六个里其中任意两个不为零即可,怎么写 #11 楼 @chunlea #8 楼 @suffering

试试这个 select (IF(condition1, 1, 0)+ IF(condition3, 1, 0) + IF(condition3, 1, 0)) as cnt from users where condition1 or condition2 or condition3 where cnt > 2

#14 楼 @sjzg001

fields = %w[a b c d e f]
fields.map { |a| fields.map { |b| a < b ? "(#{a} != 0 AND #{b} != 0)" : nil } }.inject(&:+).compact.join(" OR ")

难道不能利用 count 来做?

activerecord版的 any_of

改善数据结构,尝试用数据来主导编程

在 MySQL 中,如果条件成立,则返回 1,不成立则返回 0,所以可以这样做:

select * from users where ( (name like '%王%') + (phone = '15888882222') + (age > 15) + ...) >= 2;
22 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号