我的mySQL数据库有一个schools
和一个users
表。每所学校都有一个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应该能够从schools
中选择,只有用户4应该显示是否选择了学校1,用户3应该显示是否选择了学校2,用户5或6应该显示是否选择了3号学校。
答案 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