查询相同 table 以创建搜索屏幕的排序
Query same table to create ordering for search screen
我有一个 table User
和 RecentSearch
以及网站上的一个屏幕,允许用户找到其他用户。服务器 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;
这必须用外连接来解决吗?我有点困惑。
所以要点:
- 服务器向客户端发送
User
s,客户端将它们更新到数据库中并将标志 showOnSearchScreen 设置为 1
- 查询应该 return 至少所有将该标志设置为 1
的用户
- 我希望好友用户和用户名与输入的用户名相似(我猜 %sometext% 就够用了)优先于从服务器return输入的用户
- 同样适用于来自
RecentSearch
的 User
,如果从 RecentSearch
加入的用户具有相似的用户名,则优先于从服务器 return 加入的用户(但朋友应该显示在顶部)
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%'
我有一个 table User
和 RecentSearch
以及网站上的一个屏幕,允许用户找到其他用户。服务器 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;
这必须用外连接来解决吗?我有点困惑。
所以要点:
- 服务器向客户端发送
User
s,客户端将它们更新到数据库中并将标志 showOnSearchScreen 设置为 1 - 查询应该 return 至少所有将该标志设置为 1 的用户
- 我希望好友用户和用户名与输入的用户名相似(我猜 %sometext% 就够用了)优先于从服务器return输入的用户
- 同样适用于来自
RecentSearch
的User
,如果从RecentSearch
加入的用户具有相似的用户名,则优先于从服务器 return 加入的用户(但朋友应该显示在顶部)
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%'