假设用户可以输入多个字符串,服务器对其进行处理并将其存储在数据存储区中。是否有可能查询相似数量(没有任何解决方法)?或者有一个更好的解决方案吗?
示例查询:获取id,其中值similair为" a,b,c"
返回:1,8,9,6,10等。
示例数据:
答案 0 :(得分:0)
您应修复数据结构,以便每个ID和值都有一行。字符串操作函数在SQL中并不是特别好。
有了您的数据,您可以这样做:
select t.*,
((case when ',' || value || ',' like '%,a,%' then 1 else 0 end) +
(case when ',' || value || ',' like '%,b,%' then 1 else 0 end) +
(case when ',' || value || ',' like '%,c,%' then 1 else 0 end)
) as nummatches
from t
order by nummatches desc;
串联运算符因数据库而异;它可能是+
,&
或concat()
。
答案 1 :(得分:0)
您不能在数据存储上使用类似SQL的查询。数据存储使用有效但非常有限的索引。
但是,您可以在同一对象的单个索引中重复输入。
所以有一种方法可以做到这一点,如果你有一个像(a,b,c,d)这样的有限集,那就是 按排序顺序存储所有组合:
object 1: tags = ["a", "b", "c", "ab", "bc", "abc"]
object 2: tags = ["a", "c", "d", "ac", "cd", "acd"]
您还可以搜索前缀,即索引字符串的前N个字母。
另一种方法是查询包含“a”的所有对象,然后查询包含“b”等的所有对象,并在软件中进行交集。在你的例子中,这将是相当低效的。如果您只有少量相同的值并且仅请求键,则可以高效,然后在从数据存储区请求实际对象之前执行交集。
为支持高效查询的数据存储区设计模型可能具有挑战性,需要进行相当多的规划。如果您只使用小型数据集,则可以考虑使用CloudSQL解决方案。