我在網站上有一個表格User和RecentSearch一個螢屏,允許用戶找到其他用戶。服務器回傳一個用戶陣列而不考慮朋友和最近的搜索,我想將它包含在客戶端(客戶端是指運行這些查詢的 iOS 應用程式)。我希望朋友和最近的搜索優先于服務器回傳的內容。
我有點卡住了。我不知道該怎么做。我在下面進行了查詢,但這不起作用,因為它要求所有用戶都將標志showOnSearchScreen設定為 1,但這并不總是適用于朋友和最近的搜索。
該標志僅對showOnSearchScreen服務器回傳的用戶設定為true。這意味著 a可以將標志設定為 1 并且也可以成為朋友。UsershowOnSearchScreen
這些是我的表:
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;
這必須通過外部連接解決嗎?我有點困惑。
所以關鍵點:
- 服務器將
Users 發送給客戶端,客戶端將它們更新到資料庫中并將標志 showOnSearchScreen 設定為 1 - 查詢應至少回傳所有將該標志設定為 1 的用戶
- 我希望用戶是朋友并且用戶名與輸入相似(我猜 %sometext% 會作業得很好)優先于從服務器回傳的用戶
- 同樣適用于
Users fromRecentSearch,如果加入的用戶RecentSearch具有相似的用戶名,則優先于從服務器回傳的用戶(但朋友應該顯示在頂部)
uj5u.com熱心網友回復:
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%'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482503.html
