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