TSQL 排序结果,其中列包含列表中的所有值
TSQL order results where column contains all values from a list
我有一个带有标题列的电影 table。
- "The a"
- "the b"
- "the c"
- "the something"
当我使用输入 "the something" 查询该列时 - 我将返回所有标题包含 "the" 或 "something" 的电影。这就是我想要的。
我当前的问题是,我无法首先按包含输入中提供的所有单词的标题对结果进行排序。
由于 "the" 这个词含糊不清,很多标题都匹配它,而带有 "something" 的标题被埋在结果列表中。
在这个例子中,当我查询 "the something" - "the something" 应该排在最前面。但是由于查询匹配包含 "the" 和 "something" 的所有列,我不知道如何实现这一点。
我需要 Movies.Title 尽可能按包含 SplitStringTable 中所有值的列进行排序。如果可能的话。
我如何实现我的查询是通过在 table 上使用输入中提供的值列表执行 JOIN:
SELECT * FROM Movies m
JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) SplitStringTable
ON m.Title LIKE '%' + SplitStringTable .[Value] + '%'
任何关于如何实现这一点的想法都将不胜感激。
编辑:请大家原谅,我对我的场景的解释全错了。我将返回标题包含 SplitStringTable 中的任何值的任何记录。对于造成的混乱,我深表歉意。
您的查询将为每个匹配的单词 return 一行;因此您可以按 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
是唯一的,否则这将无法正常工作。为了确保它对行进行正确排序,并能够看到所有其他字段,您需要在 GROUP BY
表达式中包含 Movies
table 的每个字段。
顺便说一句,对于此类搜索,可能有比 SQL 更好的工具,尽管您可能会得到足够的结果。但我建议进行一项改进:
ON ' ' || m.Title || ' ' LIKE '% ' + s.[Value] + ' %'
可能有助于避免将 "the" 与 "theory"、"another" 等匹配。如果您始终可以依赖全字匹配,即...
我有一个带有标题列的电影 table。
- "The a"
- "the b"
- "the c"
- "the something"
当我使用输入 "the something" 查询该列时 - 我将返回所有标题包含 "the" 或 "something" 的电影。这就是我想要的。
我当前的问题是,我无法首先按包含输入中提供的所有单词的标题对结果进行排序。 由于 "the" 这个词含糊不清,很多标题都匹配它,而带有 "something" 的标题被埋在结果列表中。
在这个例子中,当我查询 "the something" - "the something" 应该排在最前面。但是由于查询匹配包含 "the" 和 "something" 的所有列,我不知道如何实现这一点。
我需要 Movies.Title 尽可能按包含 SplitStringTable 中所有值的列进行排序。如果可能的话。
我如何实现我的查询是通过在 table 上使用输入中提供的值列表执行 JOIN:
SELECT * FROM Movies m
JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) SplitStringTable
ON m.Title LIKE '%' + SplitStringTable .[Value] + '%'
任何关于如何实现这一点的想法都将不胜感激。
编辑:请大家原谅,我对我的场景的解释全错了。我将返回标题包含 SplitStringTable 中的任何值的任何记录。对于造成的混乱,我深表歉意。
您的查询将为每个匹配的单词 return 一行;因此您可以按 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
是唯一的,否则这将无法正常工作。为了确保它对行进行正确排序,并能够看到所有其他字段,您需要在 GROUP BY
表达式中包含 Movies
table 的每个字段。
顺便说一句,对于此类搜索,可能有比 SQL 更好的工具,尽管您可能会得到足够的结果。但我建议进行一项改进:
ON ' ' || m.Title || ' ' LIKE '% ' + s.[Value] + ' %'
可能有助于避免将 "the" 与 "theory"、"another" 等匹配。如果您始终可以依赖全字匹配,即...