Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 将两个复杂的SQL查询合并为一个查询_Mysql_Sql - Fatal编程技术网

Mysql 将两个复杂的SQL查询合并为一个查询

Mysql 将两个复杂的SQL查询合并为一个查询,mysql,sql,Mysql,Sql,我的mySQL数据库有一个学校和一个用户表。每个学校都有一个标识它的id。当用户加入学校时,用户的school列被设置为该学校的id。我需要执行一个执行以下操作的请求: 从已加入用户的数据库中获取随机学校。(数据库中必须至少有一名学生的school列设置为该学校的id) 获取该学校具有最高(成功/尝试)值的用户 如果学校中的多个用户绑定为最高值,则查询将随机选择一个用户并返回该用户 作为回报,我只需要用户对象。我知道我可以使用PHP进行一些工作,但我希望在SQL查询中完成大部分工作。如果可能的话

我的mySQL数据库有一个
学校
和一个
用户
表。每个学校都有一个标识它的
id
。当用户加入学校时,用户的
school
列被设置为该学校的
id
。我需要执行一个执行以下操作的请求:

  • 从已加入用户的数据库中获取随机学校。(数据库中必须至少有一名学生的
    school
    列设置为该学校的
    id
  • 获取该学校具有最高(成功/尝试)值的用户
  • 如果学校中的多个用户绑定为最高值,则查询将随机选择一个用户并返回该用户 作为回报,我只需要用户对象。我知道我可以使用PHP进行一些工作,但我希望在SQL查询中完成大部分工作。如果可能的话,我想在一个请求中完成这一切。这可能吗?到目前为止,我已经想到:

    SELECT  *
    FROM  `schools` 
    INNER JOIN  `users` ON schools.id = users.school
    ORDER BY RAND( ) 
    LIMIT 1
    
    此时,我可以在PHP中将所选学校的id保存为$schoolID并执行另一个请求:

    SELECT * 
    FROM  `users` 
    WHERE school =2
    AND attempts !=0
    ORDER BY (
    successes / attempts
    ) DESC , RAND( ) 
    LIMIT 1
    
    有没有办法将它们组合到一个SQL查询中以节省服务器负载

    结构:

    用户表:

    +------------+----------+------+-----+---------+----------------+
    | Field      | Type     | Null | Key | Default | Extra          |
    +------------+----------+------+-----+---------+----------------+
    | id         | int(11)  | NO   | PRI |         | auto_increment |
    | username   | char(35) | NO   |     |         |                |
    | school     | int(11)  | YES  |     |         |                |
    | successes  | int(11)  | NO   |     | 0       |                |
    | attempts   | int(11)  | NO   |     | 0       |                |
    +------------+----------+------+-----+---------+----------------+
    
    学校表:

    +------------+----------+------+-----+---------+----------------+
    | Field      | Type     | Null | Key | Default | Extra          |
    +------------+----------+------+-----+---------+----------------+
    | id         | int(11)  | NO   | PRI |         | auto_increment |
    | name       | char(35) | NO   |     |         |                |
    +------------+----------+------+-----+---------+----------------+
    
    样本数据: 用户表:

    id  username    school  successes   attempts
    1   josh        1       0           0
    2   james       2       0           1
    3   ashley      2       2           2
    4   john        1       1           1
    5   will        3       4           8
    6   jack        3       1           2
    
    学校表:

    id  name
    1   school1
    2   school2
    3   school3 
    4   school4
    

    只能从
    学校
    中选择学校1-3,只有用户4应显示是否选择了学校1,用户3应显示是否选择了学校2,用户5或6应显示是否选择了学校3

    再次修改,使其不会检索内部查询中的所有记录。可以安全地与较大的数据集一起使用。内部select获取具有有效用户记录的随机学校。外部选择在该学校记录上进行选择,并按成功/尝试进行排序,并限制为一。使用您的数据进行测试

    SELECT s.id, s.name, users.username, users.successes, users.attempts 
    FROM ((SELECT schools.id, schools.name from schools INNER JOIN users on schools.id = users.school
        WHERE users.attempts !=0
        ORDER BY RAND()
        LIMIT 1) s)
    INNER JOIN users on s.id = users.school
    ORDER BY users.successes / users.attempts DESC
    LIMIT 1
    

    再次修改,使其不会检索内部查询中的所有记录。可以安全地与较大的数据集一起使用。内部select获取具有有效用户记录的随机学校。外部选择在该学校记录上进行选择,并按成功/尝试进行排序,并限制为一。使用您的数据进行测试

    SELECT s.id, s.name, users.username, users.successes, users.attempts 
    FROM ((SELECT schools.id, schools.name from schools INNER JOIN users on schools.id = users.school
        WHERE users.attempts !=0
        ORDER BY RAND()
        LIMIT 1) s)
    INNER JOIN users on s.id = users.school
    ORDER BY users.successes / users.attempts DESC
    LIMIT 1
    

    再次修改,使其不会检索内部查询中的所有记录。可以安全地与较大的数据集一起使用。内部select获取具有有效用户记录的随机学校。外部选择在该学校记录上进行选择,并按成功/尝试进行排序,并限制为一。使用您的数据进行测试

    SELECT s.id, s.name, users.username, users.successes, users.attempts 
    FROM ((SELECT schools.id, schools.name from schools INNER JOIN users on schools.id = users.school
        WHERE users.attempts !=0
        ORDER BY RAND()
        LIMIT 1) s)
    INNER JOIN users on s.id = users.school
    ORDER BY users.successes / users.attempts DESC
    LIMIT 1
    

    再次修改,使其不会检索内部查询中的所有记录。可以安全地与较大的数据集一起使用。内部select获取具有有效用户记录的随机学校。外部选择在该学校记录上进行选择,并按成功/尝试进行排序,并限制为一。使用您的数据进行测试

    SELECT s.id, s.name, users.username, users.successes, users.attempts 
    FROM ((SELECT schools.id, schools.name from schools INNER JOIN users on schools.id = users.school
        WHERE users.attempts !=0
        ORDER BY RAND()
        LIMIT 1) s)
    INNER JOIN users on s.id = users.school
    ORDER BY users.successes / users.attempts DESC
    LIMIT 1
    


    我认为如果你提供样本数据和期望的结果,解释会更清楚。我已经尝试简化期望的结果。如果您仍然不理解,我可以添加一些示例数据。我认为如果您提供示例数据和所需结果,说明会更清楚。我已尝试简化所需结果。如果您仍然不理解,我可以添加一些示例数据。我认为如果您提供示例数据和所需结果,说明会更清楚。我已尝试简化所需结果。如果您仍然不理解,我可以添加一些示例数据。我认为如果您提供示例数据和所需结果,说明会更清楚。我已尝试简化所需结果。如果你仍然不明白,我可以添加一些样本数据。我记下我的答案,直到我可以进一步测试。这个查询应该可以工作。我也将使用您的结构和数据进行测试。如果在结果中包括users.successfuls和users.truments,您将看到这不起作用。它返回的用户的最大值(users.successions/users.attempts)低于学校的最大值。根据我输入的数据,它返回的是成功/尝试的最大值(十进制值)。你确定你看到的是学校最大的成功/尝试,而不仅仅是最大的成功吗?是的,我确定。我已经发布了一些样本数据和预期结果。我尝试了您的查询,虽然返回的最大值是正确的,但它返回了错误的用户(具有不同最大值的用户)。编辑:也许你误解了目标。我不关心实际的最大值,只关心它所属的用户。我已经修改了它,以便它可以按照您的意愿执行。我不知道如何限制检索内部查询中的所有记录。因此,它将提取搜索中的所有记录。我记下我的答案,直到我可以进一步测试。这个查询应该可以工作。我也将使用您的结构和数据进行测试。如果在结果中包括users.successfuls和users.truments,您将看到这不起作用。它返回的用户的最大值(users.successions/users.attempts)低于学校的最大值。根据我输入的数据,它返回的是成功/尝试的最大值(十进制值)。你确定你看到的是学校最大的成功/尝试,而不仅仅是最大的成功吗?是的,我确定。我已经发布了一些样本数据和预期结果。我尝试了您的查询,虽然返回的最大值是正确的,但它返回了错误的用户(具有不同最大值的用户)。编辑:也许你误解了目标。我不关心实际的最大值,只关心它所属的用户。我已经修改了它,以便它可以按照您的意愿执行。我不知道如何限制检索内部查询中的所有记录。因此,它将提取搜索中的所有记录。我记下我的答案,直到我可以进一步测试。这个查询应该可以工作。我也将使用您的结构和数据进行测试。如果在结果中包括users.successfuls和users.truments,您将看到这不起作用。它返回的用户的最大值(users.successions/users.attempts)低于学校的最大值。根据我输入的数据,它返回的是成功/尝试的最大值(十进制值)。你确定吗?