微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – mysql查询逻辑,用于在特定条件下从3个相关表中获取数据

我正在网络平台上建立一个编程竞赛控制器,它有一些表,包括’竞赛’,’问题’和’关系’表,我遇到了麻烦.

‘竞赛’表的结构:contest_id,contest_name(为简单起见)

============================
|contest_id | contest_name |
|-----------|--------------|
|          1|  Test Contest|
|-----------|--------------|
|          2|   Another One|
============================

‘problem’表的结构:problem_id,problem_name(为简单起见)

============================
|problem_id | problem_name |
|-----------|--------------|
|          1|     A Problem|
|-----------|--------------|
|          2| Other Problem|
============================

‘relation’表的结构: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()来删除所选竞赛的关系表中已有的问题.

SELECT * FROM problem WHERE 
    problem.problem_id NOT IN (SELECT problem_id FROM relation WHERE contest_id = 2)

NOT IN()确保表达式继续没有参数中存在的任何值.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐