为什么当我按多个变量排序时,它只按列出的最后一个排序?

时间:2015-06-06 00:10:59

标签: postgresql sequel

这是我发送的原始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}

正如您所看到的,它返回那些与特殊符号相匹配的行,但组件被忽略,尽管它们在排序中的特殊符号之前。 附:我可以确保我查询表中的组件值存在于其中,因此它们不会被忽略,因为它们不存在。

0 个答案:

没有答案