sql - 排序联合但保持不同

标签 sql sql-server distinct union

如何查询表Store(ID,Title,Company) 获取标题包含“term”的所有记录,首先显示完全匹配的记录,然后显示部分匹配。 换句话说,如果我正在寻找“foo”,我希望记录显示为

  • 福和儿子们
  • 好东西
  • 富酒吧
  • 足球
  • 她的傻瓜

这是我所拥有的

Create PROCEDURE [dbo].[SearchUserInfo] 
@query nvarchar(500),
@term nvarchar(500)

(SELECT Title,Company,
1 as match
FROM Stores 
WHERE CONTAINS(Title, @query))

UNION 

(SELECT Title,Company,
0 as match
FROM Stores 
WHERE Title like '%' + @term +'%')

order by match desc

此查询的问题是它返回重复的记录。 如果我删除 0 作为匹配项,我不知道如何排序,因此 CONTAINS 的结果将出现在 LIKE 的结果之前。

谢谢

最佳答案

您可以合并两个结果集,然后使用 GROUP BY 删除重复项,并使用 ORDER BY MAX(match) DESC 放置 CONTAINS 返回的组 首先

;WITH CTE
     AS (SELECT Title,
                Company,
                1 AS match
         FROM   Stores
         WHERE  CONTAINS(Title, @query)
         UNION ALL
         SELECT Title,
                Company,
                0 AS match
         FROM   Stores
         WHERE  Title LIKE '%' + @term + '%')
SELECT Title,
       Company,
FROM   CTE
GROUP  BY Title,
          Company
ORDER  BY MAX(match) DESC

关于sql - 排序联合但保持不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13848521/

相关文章:

php - Wamp 中的 "Call to undefined function sqlsrv_connect()",已安装驱动程序

sql - 错误: "Must declare the scalar variable" for insert statements in multiple database

MySQL 计数、融化( reshape )变量

c# - LINQ OrderBy().ThenBy() 不工作

java - 合并现有对象不会更新数据库中更改的@Embedded

mysql - 如何在MySQL中连接两个表而不重复两列

mysql - 与加入 codeigniter mysql 不同

mysql - 如何使用 JOIN 从日期中选择不同的一天

MYSQL 存储过程 - 如果满足某些条件则更新多个列

php - 我如何使用 php 和 codeigniter 将数据插入数据库