簡體   English   中英

mysql查詢邏輯,用於在特定條件下從3個相關表中獲取數據

[英]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()來刪除所選contestrelation表中已有的問題。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM