我正在 Web 平台上构建一个编程竞赛 Controller ,它有一些表格,包括“竞赛”、“问题”和“关系”表格,我在处理这些表格时遇到了麻烦。
“比赛”表的结构:比赛 ID、比赛名称(为简单起见)
============================
|contest_id | contest_name |
|-----------|--------------|
| 1| Test Contest|
|-----------|--------------|
| 2| Another One|
============================
“问题”表的结构:problem_id、problem_name(为简单起见)
============================
|problem_id | problem_name |
|-----------|--------------|
| 1| A Problem|
|-----------|--------------|
| 2| Other Problem|
============================
“关系”表的结构:rel_id、contest_id、problem_id
===========================================
| rel_id | contest_id | problem_id |
|-----------|--------------|--------------|
| 1| 1| 1|
|-----------|--------------|--------------|
| 2| 1| 2|
|-----------|--------------|--------------|
| 3| 1| 8|
|-----------|--------------|--------------|
| 4| 2| 5|
|-----------|--------------|--------------|
| 5| 2| 8|
===========================================
我计划允许管理员设置一次系统,然后根据他/她的需要进行尽可能多的比赛,因此可以将相同的“problem_id”分配给多个“contest_id”。
对于单个比赛,我正在使用此查询获取该比赛的所有“problem_id”以及该问题的所有内容:
SELECT * FROM `problem` JOIN `relation` on `relation`.`problem_id` = `problem`.`problem_id` WHERE `contest_id` = 3 // say the id is 3
但是在编辑比赛并在其中添加更多问题时,我只需要获取那些问题以显示哪些问题还没有出现在同一比赛中。
我试过这个但没有用,给了我一些重复和其他比赛问题:
SELECT * FROM `problem` LEFT JOIN `relation` on `relation`.`problem_id` != `problem`.`problem_id` WHERE `contest_id` != 3
我可以在 php 中做同样的事情,使用两个循环,一个循环遍历整个系统和那个循环中的所有“problem_id”,另一个循环仅遍历该竞赛的所有“problem_id”,反之亦然.但它会花费我 O(n^2) 的复杂性,我确信可以使用 mysql 查询来避免。任何在 php 中更有效地做到这一点的想法对我来说也有好处。感谢您的帮助。
最佳答案
您可以使用 MYSQL NOT IN()
删除已存在于所选 contest
的 relation
表中的问题。
SELECT * FROM problem WHERE
problem.problem_id NOT IN (SELECT problem_id FROM relation WHERE contest_id = 2)
NOT IN()
确保所进行的表达式不包含参数中存在的任何值。
关于php - 在特定条件下从 3 个相关表中获取数据的 mysql 查询逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877625/