[英]mysql query logic for fetching data from 3 related tables on certain condition
我正在網絡平台上建立一個編程競賽控制器,它有一些表,包括'競賽','問題'和'關系'表,我遇到了麻煩。
'競賽'表的結構: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()
來刪除所選contest
的relation
表中已有的問題。
SELECT * FROM problem WHERE
problem.problem_id NOT IN (SELECT problem_id FROM relation WHERE contest_id = 2)
NOT IN()
確保表達式繼續沒有參數中存在的任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.