优先搜索 - SQL

时间:2015-06-18 14:20:50

标签: sql

考虑用户输入关键字来搜索图书。首先,应用程序按书名匹配搜索,如果超过50本书与搜索匹配则返回结果;如果没有,它按书籍作者匹配搜索。如果一起匹配的书籍不超过50本,那么按书籍描述匹配则匹配。

SQL可以处理这种情况吗?或者我必须用ifs和elseifs编写存储过程?

[补充]我使用MySQL5.6。但我觉得答案在于ANSI-SQL,所以我没有指定它。非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

一种方法是使用单个查询进行所有比较,然后对结果进行优先级排序。 ANSI标准语法如下:

limit

当然,所有数据库都不支持最终子句,因此它可能是top或{{1}}或更糟糕的事情。

如果你有一个大表,并且性能是一个问题,还有其他方法来表达查询,具体取决于匹配条件的样子。

答案 1 :(得分:1)

您可以使用带有子查询的union all来实现它。

SELECT DISTINCT TOP(50) bookname
FROM (
    SELECT TOP(50) bookname, 1 as rank
    FROM yourTable
    WHERE bookTitle = N'BLA'
    UNION
    SELECT TOP(50) bookname, 2 as rank
    FROM yourTable
    WHERE bookAuthor = N'BLA'
    UNION
    SELECT TOP(50) bookname, 3 as rank
    FROM yourTable
    WHERE bookDescription = N'BLA'
) as data
ORDER BY rank

这适用于SQL Server。在MySQL上,您需要使用LIMIT而不是TOP。 您应该指定在标签中使用的服务器。

编辑(由其他用户):

这是一个公认的答案,但它有一个问题,因为它可能会返回重复项。符合所有三个条件的书籍可以返回三次。 union并没有消除它们,因为rank在每一行都不同。

一种解决方案是删除排名并使用case中的order by语句:

order by (case when bookTitle = N'BLA' then 1
               when bookAuthor = N'BLA' then 2
          end)

作者编辑: 我使用已定义的列名称和一个distinct来更改上面的代码,这将保留重复的条目。