У меня есть таблица USERSEARCH, которую следует использовать для быстрого поиска подстроки для пользователей. Эта функция предназначена для поиска с автозаполнением, который происходит, когда кто-то вводит имя пользователя или имя. Однако интересующий меня запрос будет показывать только совпадения от пользователей, за которыми следует человек.
USERSEARCH
-----------------------------------------------
user_id(FK) username_ngram name_ngram
1 "AleBoy leBoy eBoy..." "Ale le e"
2 "craze123 raze123 ..." "Craze raze aze ze e"
3 "john1990 ohn1990 ..." "John ohn hn n"
4 "JJ_1 J_1 _1 1" "JJ"
USERRELATIONSHIP
-----------------------------------------------
user_id(FK) follows_id(FK)
2 1
2 3
Следующий запрос выполняется, поскольку кто-то только что набрал «Al»:
SELECT * FROM rage.usersearch where username_ngram like 'Al%' --1
UNION DISTINCT
SELECT * FROM rage.usersearch where name_ngram like 'Al%' --2
UNION DISTINCT
SELECT * FROM rage.usersearch --3
WHERE MATCH (username_ngram, name_ngram) AGAINST ('Al')
LIMIT 10
Индексы
index(user_id)
index(username_ngram)
index(name_ngram)
FULLTEXT(username_ngram, name_ngram)
Есть ли способ ограничить приведенный выше запрос, чтобы он смотрел только на это подмножество user_ids (без запроса их 3 раза для каждого подзапроса) ?
SELECT follows_id FROM rage.userrelationship WHERE user_id={user_id of user doing the searching}