这是我发送的原始SQL查询
SELECT name, tags, components, metas, specials,
array_length(ARRAY(SELECT * FROM UNNEST(components) WHERE UNNEST = ANY(ARRAY['a','b'])), 1) AS componentmatch,
array_length(ARRAY(SELECT * FROM UNNEST(specials) WHERE UNNEST = ANY(ARRAY['m'])), 1) AS specialmatch,
array_length(ARRAY(SELECT * FROM UNNEST(metas) WHERE UNNEST = ANY(ARRAY['v', 't'])), 1) AS metamatch
FROM films
WHERE tags && ARRAY['a','b', 'm', 'v', 't']
ORDER BY componentmatch DESC, metamatch DESC, specialmatch DESC
LIMIT 5
如果我理解它是如何工作的,它应该按metamatch排序,然后,如果metamatch是相同的,使用componentmatch然后才能匹配。
但是,它只按特殊匹配排序并完全忽略其他标准。我试着改组订单,发现它总是按列出的最后标准排序。 我做错了吗?
P.S。我怀疑这可能是因为我按投影变量对其进行排序。
查询:
:components => ["c", "ca"], :specials => ["4/7"], :metas => []
示例输出:
{:name=>"Rydge", :component_tags=>[], :special_tags=>["4/7"], :metas=>["Lodge"], :tags=>["4/7", "Lodge"], :componentmatch=>nil, :categorymatch=>nil, :specialmatch=>1}
{:name=>"Ranada", :component_tags=>[], :special_tags=>["4/7"], :metas=>["Place"], :tags=>["4/7", "Place"], :componentmatch=>nil, :categorymatch=>nil, :specialmatch=>1}
{:name=>"Nomads", :components=>["a"], :specials=>["4/7"], :metas=>["Place"], :tags=>["a", "4/7", "Place"], :componentmatch=>nil, :categorymatch=>nil, :specialmatch=>1}
{:name=>"Vido", :components=>["a"], :specials=>["4/7"], :metas=>[], :tags=>["a", "4/7"], :componentmatch=>nil, :categorymatch=>nil, :specialmatch=>1}
{:name=>"New Nomen", :components=>["a", "fa"], :specials=>["4/7"], :metas=>["Place"], :tags=>["a", "fa", "4/7", "Place"], :componentmatch=>nil, :categorymatch=>nil, :specialmatch=>1}
正如您所看到的,它返回那些与特殊符号相匹配的行,但组件被忽略,尽管它们在排序中的特殊符号之前。 附:我可以确保我查询表中的组件值存在于其中,因此它们不会被忽略,因为它们不存在。