MySQL结合了结果

时间:2013-09-13 03:09:07

标签: mysql sql

我有一个表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个查询中完成所有这些操作?

由于

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