php - 在特定条件下从 3 个相关表中获取数据的 mysql 查询逻辑

标签 php mysql

我正在 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() 删除已存在于所选 contestrelation 表中的问题。

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/

相关文章:

javascript - 如何删除上传的图片?

php - 在收到请求时在 Yii2 中的 $_POST 中设置值?

MySQL 分组并合并 JSON 值

php - 从表1中获取id与表2匹配

php 脚本无法使用 SSL 连接到 MySQL

php - 使用一条语句从多个表中删除多个mysql行

javascript - Ajax 调用仅传递第一个元素的 id

php - 在 php 中选择 auto_increment 字段返回空白

php - <输入类型="file"接受="image/*;capture=camera">使用php将图像保存到数据库

mysql - 登录/注册表单只允许每个人使用 MYSQL 登录一次