查询相同 table 以创建搜索屏幕的排序

Query same table to create ordering for search screen

我有一个 table UserRecentSearch 以及网站上的一个屏幕,允许用户找到其他用户。服务器 return 是一个用户数组,没有考虑朋友和最近的搜索,我想将它包括在客户端(客户端意味着 iOS 应用程序 运行 这些查询)。 我希望朋友和最近搜索优先于服务器 returns.

我有点卡住了。我不知道该怎么做。我在下面进行了查询,但这不起作用,因为它要求所有用户将标志 showOnSearchScreen 设置为 1,但这并不总是适用于朋友和最近的搜索。

标记 showOnSearchScreen 对服务器 return 的用户设置为 true。这意味着 User 可以将标志 showOnSearchScreen 设置为 1 并且也可以成为朋友。

这些是我的 table:

create table User (
    userUuid text not null primary key,
    username text not null,
    showOnSearchScreen int not null,
    friends int not null
);

create table RecentSearch (
    userUuid text not null primary key,
    foreign key (userUuid) references User (userUuid) on delete cascade
);

这是我的查询,它不起作用(假设用户正在搜索某处带有 'g' 的用户):

select *,
       case
           when exists(select 1
                       from User CustomUser
                       where User.userUuid = CustomUser.userUuid
                         and CustomUser.friends = 1
                         and CustomUser.username like '%g%') then 2
           else 0 end as friendScore,
       case
           when exists(select 1
                       from RecentSearch
                                join User CustomUser on RecentSearch.userUuid = CustomUser.userUuid and
                                                        User.userUuid = RecentSearch.userUuid
                       where CustomUser.username like '%g%') then 1
           else 0 end as recentSearchScore
from User
-- This is wrong...
where showOnSearchScreen = 1
order by friendScore + recentSearchScore;

这必须用外连接来解决吗?我有点困惑。

所以要点:

IIUC - 考虑一个 UNION 查询,该查询可能会使用分数确定优先级或顺序来解决您的要点:

SELECT userUuid, username, 3 AS score
FROM User
WHERE friends = 1 
  AND username LIKE '%g%'

UNION

SELECT r.userUuid, u.username, 2 AS score
FROM RecentSearch r
 JOIN User u ON r.userUuid = u.userUuid 
WHERE u.username LIKE '%g%'

UNION

SELECT userUuid, username, 1 AS score
FROM User 
WHERE showOnSearchScreen = 1 
  AND username LIKE '%g%'