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

时间:2014-05-26 02:34:31

标签: mysql sql

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

  1. 从用户加入的数据库中获取一个随机学校。 (数据库中必须至少有一名学生的school列设置为该学校的id。)
  2. 获取该学校中具有最高(成功/尝试)值的用户。
  3. 如果学校中的多个用户被绑定为最高值,则查询将选择随机用户并将其返回。
  4. 我需要的只是用户对象。我知道我可以使用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应该能够从schools中选择,只有用户4应该显示是否选择了学校1,用户3应该显示是否选择了学校2,用户5或6应该显示是否选择了3号学校。

1 个答案:

答案 0 :(得分:3)

再次修改,以便它不会检索内部查询中的所有记录。可以安全地使用更大的数据集。内部选择获得具有有效用户记录的随机学校。外部选择选择该学校记录,并按成功/尝试和限制进行排序。使用您的数据进行测试。

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