0

我有一张桌子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

大多数时候,上面的查询只返回几个结果(因为我没有搜索整个用户表)。

我想要做的是结合上述 2 个查询,返回与某个字符串匹配的用户名的 10 个结果的最大值,首先列出用户的关注,然后搜索整个用户表。

我已经有了一个解决方案,但它需要在应用程序级别执行此操作,首先运行第二个查询,然后首先运行两个查询。有没有办法可以在 1 个查询中完成所有这些操作?

谢谢

4

1 回答 1

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

请注意,我使用 aLEFT 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
于 2013-09-13T03:57:44.630 回答