首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定结果的优先次序

如何确定结果的优先次序
EN

Stack Overflow用户
提问于 2017-09-01 02:43:33
回答 2查看 3.1K关注 0票数 3

我有一张四栏的桌子。我想显示基于输入的行,它应该能够根据优先级字段显示优先级。

示例:我的表如下所示:

代码语言:javascript
复制
ID  title          description    tags
1   web developer  designer       front-end
2   designer       front-end      web developer
3   front-end      web developer  designer

下面是我的测试用例,它应该如何工作:

代码语言:javascript
复制
$input = 'web developer' // the sequence should be IDs : 1, 3, 2
$input = 'front-end'     // output sequence result is : 3, 2, 1
$input = 'designer'      // result sequence : 2, 1, 3

现在,我想将结果排序,从标题到基于输入的标记。

代码语言:javascript
复制
$blog = DB::('blogs')
        ->where('title', 'LIKE', '%$title%')
        ->where('description', 'LIKE', '%$title%')
        ->where('tags', 'LIKE', '%$title%');

但上面的代码,似乎没有..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-01 02:55:58

我认为您希望对结果排序的逻辑应该出现在ORDER BY子句中。考虑以下原始查询:

代码语言:javascript
复制
SELECT *
FROM yourTable
ORDER BY
    CASE WHEN title = 'web developer'       THEN 0 ELSE 1 END,
    CASE WHEN description = 'web developer' THEN 0 ELSE 1 END,
    CASE WHEN tags = 'web developer'        THEN 0 ELSE 1 END;

输出:

下面是我使用orderByRaw实现Laravel代码的尝试

代码语言:javascript
复制
$orderByClause  = "CASE WHEN title = '".$input."' THEN 0 ELSE 1 END,";
$orderByClause .= "CASE WHEN description = '".$input."' THEN 0 ELSE 1 END,";
$orderByClause .= "CASE WHEN tags = '".$input."' THEN 0 ELSE 1 END";

$blog = DB::('blogs')
        ->orderByRaw($orderByClause)
        ->get();

我找不到关于如何参数化orderByRaw的任何(有用的)文档,所以我使用了字符串连接。

演示这里:

Rextester

票数 7
EN

Stack Overflow用户

发布于 2017-09-01 02:54:27

不是很好的解决办法,但这可能对你有帮助,

代码语言:javascript
复制
$input = 'web developer';

$byTitle = DB::('blogs')
           ->where('title', 'LIKE', '%$input%')
           ->select('id');

$byDescription = DB::('blogs')
                 ->where('description', 'LIKE', '%$input%')
                 ->select('id');

$byTag = DB::('blogs')
         ->where('tag', 'LIKE', '%$input%')
         ->select('id');

$ids = $byTitle->union($byDescription)->union($byTag)->get();

您可以根据列选择id,然后将它们合并以获得数据。

如果您想通过UNION处理这个问题,那么原始查询会是什么样的呢?

代码语言:javascript
复制
SELECT ID, 1 AS priority
FROM blogs
WHERE title = 'web developer'
UNION
SELECT ID, 2
FROM blogs
WHERE description = 'web developer'
UNION
SELECT ID, 3
FROM blogs
WHERE tags = 'web developer'
ORDER BY
    priority,
    ID

这里的一个警告是,如果给定的记录对于两个或两个以上的标题、描述或标记列具有相同的值,那么结果集中就会出现重复的记录。从您的原始数据,这似乎没有发生,虽然这是一个边缘的情况值得一提。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45992637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档