我有一个表users
,我有一个简单的搜索查询:
SELECT *
FROM users
WHERE username LIKE 'rya%'
LIMIT 10
我还有另一个名为follows
的表,它基本上是其他用户所遵循的用户列表。我修改了上述查询,仅在特定用户所关注的内容中进行搜索:
SELECT users.*
FROM follows
INNER JOIN users ON users.id = follows.following_id
WHERE username LIKE 'rya%' AND follows.follower_id = 18
LIMIT 10
大多数情况下,上面的查询只返回几个结果(因为我不搜索整个users表)。
我想要做的是组合上面的2个查询,返回最多10个匹配某个字符串的用户名结果,首先列出用户的跟随,然后搜索整个用户表。
我已经有了一个解决方案,但它需要在应用程序级别执行此操作,方法是先运行第二个查询,然后再运行第二个查询。有没有办法在1个查询中完成所有这些操作?
由于
答案 0 :(得分:1)
执行此操作的一种方法是搜索整个用户表,但是对结果进行排序,以便首先显示关注者。没有架构,样本数据和输出,你有点难以理解你想要的东西,但是像
这样的东西SELECT users.*
FROM users
LEFT JOIN follows ON users.id = follows.following_id
WHERE username LIKE 'rya%'
ORDER BY follows.follower_id = 18 DESC
LIMIT 10
请注意,我使用LEFT JOIN
来获取所有用户。另一种方法是UNION
两个表的结果并包装在SELECT
中。我不知道为什么你会这样做,给出另一种选择,但它会像
SELECT *
FROM (
SELECT users.*
FROM follows
INNER JOIN users ON users.id = follows.following_id
WHERE username LIKE 'rya%' AND follows.follower_id = 18
LIMIT 10
UNION
SELECT *
FROM users
WHERE username LIKE 'rya%'
LIMIT 10
) AS u
LIMIT 10
修改强>
由于第二个适合您,我认为我使用UNION ALL
抛出变体,这可能比UNION
更快,因为它不会删除重复的行。你必须确保自己没有重复,我们可以这样做
SELECT *
FROM (
SELECT users.*
FROM follows
INNER JOIN users ON users.id = follows.following_id
WHERE username LIKE 'rya%' AND follows.follower_id = 18
LIMIT 10
UNION ALL
SELECT users.*
FROM follows
INNER JOIN users ON users.id = follows.following_id
WHERE username LIKE 'rya%' AND follows.follower_id != 18
LIMIT 10
) AS u
LIMIT 10