Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL梳理结果_Mysql_Sql - Fatal编程技术网

MySQL梳理结果

MySQL梳理结果,mysql,sql,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 'r

我有一个表
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表)

我想做的是结合上面的两个查询,返回最多10个匹配某个字符串的用户名结果,首先列出用户的以下内容,然后搜索整个用户表

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


谢谢

一种方法是搜索整个用户表,但对结果进行排序,以便追随者首先出现。如果没有模式、样本数据和输出,要理解您想要的东西有点困难,但类似于

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
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
请注意,我使用了
左连接
,以获取所有用户。另一种方法是将两个表的结果进行
联合
,并将其包装成
选择
。我不知道为什么你会这样做,因为有其他的选择,但它会像

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
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

通常的练习:表模式、示例数据和所需的输出。不过,第二次查询要快得多。谢谢你的回复。很好,我很高兴我提出了问题。你有跟踪者id索引吗?我怀疑,如果索引正确,第一个查询可能会非常快。