好的,这是一个有点复杂的
我目前有一个搜索功能,允许客户根据一个或多个州搜索记录。
他们可以输入多个状态,该功能将搜索帖子以匹配与这些状态中任何一个匹配的帖子。
这样一来,帖子只能有一个状态。
我正在努力扩展并允许每个帖子都有多个状态。但为了实现这一点,我需要弄清楚如何将任何一个seached状态与任何一个posted状态相匹配。
在本例中,type = "dest"
和states = "mo, ks, ar, ok"
def PrepareSearch.states(type, states)
states = states.split(",")
st = ""
states.each {|s| st += "'#{s}'," }
st = st[0..-2]
"#{type}_state IN (#{st})"
end
它将匹配destrongtate中有任何一个状态并且中只有1个状态的帖子
我需要这个扩展并匹配这样的东西:
dest_state = "mo, ks, ok, ar"
states = "ks, ne, co"
我需要匹配,因为ks
在两个中
但如果它在dest_state
和中只有一个状态,我也需要它工作
我的数据库有10万条以上的记录,我们将对此进行搜索
dest_state
是数据库中记录中存储的字段
您可以使用Postgres"重叠"运算符&&
:
SELECT * FROM tbl WHERE dest_state && states;
另一个好处是,状态数组列上的GIN索引可以支持此运算符。为性能带来巨大的差异。示例:
- 检查Postgres数组中是否存在任何给定的值数组
由于您的表很大,我会使用int
或smallint
而不是字符串作为"状态"代码。或者使用enum
。
另一种选择是规范化数据库模式,并将其实现为posts和state之间的n:m关系。详细信息:
- 如何在PostgreSQL中实现多对多关系