我有一个表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个用户名的结果,这些用户名匹配一个特定的字符串,并首先列出用户的以下内容,然后搜索整个用户表。
我已经有了一个解决方案,但是它需要在应用程序级别上这样做,首先运行第二个查询,然后先运行这两个查询。有什么方法可以在一个查询中完成所有这些吗?
谢谢
发布于 2013-09-13 03:57:44
这样做的一种方法是搜索整个用户表,但要对结果进行排序,以便追随者首先出现。如果没有模式、示例数据和输出,很难理解您想要什么,但类似的情况如下
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 10https://stackoverflow.com/questions/18777669
复制相似问题