TSQL订单结果,其中列包含列表中的所有值

时间:2017-03-08 16:40:54

标签: sql sql-order-by

我有一个带有标题栏的电影表。

  1. " a"
  2. " b"
  3. " c"
  4. "东西"
  5. 当我用输入&#34时查询该列时," - 我正在归还所有电影,标题包含EITHER""或者"某事"。这就是我想要的。

    我目前的问题是我无法首先按照包含输入中提供的所有字词的标题来排序我的结果。 由于""是如此模糊,许多标题匹配它,标题与"东西"埋没在结果列表中。

    在这个例子中,当我查询"的东西" - "东西"应该在顶部订购。但由于查询匹配包含""的所有列。和"某事"我不知道如何实现这一目标。

    我需要Movies.Title按可能包含SplitStringTable中所有值的列进行排序。如果可能的话。

    我如何实现我的查询是通过在表格上执行JOIN,并在输入中提供值列表:

    SELECT * FROM Movies m 
    JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) SplitStringTable 
    ON m.Title LIKE '%' + SplitStringTable .[Value] + '%'
    

    如何实现这一点的任何想法将不胜感激。

    编辑:请原谅我所有人,我解释说我的情况都错了。我将返回任何记录,其中Title包含SplitStringTable中的任何值。我为这种困惑道歉。

1 个答案:

答案 0 :(得分:1)

您的查询将为匹配的每个字返回一行;因此,您可以按Movies记录中的字段进行分组,然后ORDER BY count(*) DESC。由于我不了解所有领域,我只能向您展示我的意思:

SELECT m.TITLE
  FROM      Movies m 
       JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) s 
         ON m.Title LIKE '%' + s.[Value] + '%'
 GROUP BY m.TITLE
 ORDER BY count(*) DESC

但除非TITLE是唯一的,否则这不会正常工作。要确保它正确地对行进行排序,并且能够查看所有其他字段,您需要在Movies表达式中包含GROUP BY表的每个字段。

顺便说一下,对于这种类型的搜索,可能有比SQL更好的工具,不过你可能会得到足够的搜索结果。但我建议一个改进:

ON ' ' || m.Title || ' ' LIKE '% ' + s.[Value] + ' %'

可能有助于避免匹配""反对"理论","另一个"等等。如果你总是可以依靠全字匹配,那就是......