2011-07-19 37 views
0

兩個澄清:MySQL的呼籲對某些行額外的過濾,僅當其它表填充

  • 我要去實際上是在做分頁這一點,因此,最好可以是一個SQL語句。 ..
  • 如果這有幫助,我想要做的是:獲取用戶的所有內容,但如果content_criteria表中的內容項具有條件,請檢查該用戶是否在users_criteria表中有條件,否則,內容對於用戶

所以這可能很難解釋。讓我們先從主表:

內容:

| contentIdNum | contentStr | programIdNum | 

一塊的內容(不同於用戶)只能與一個程序關聯。 一個典型的記錄就是這樣。兩者都與一個程序的1

| 1 | Zelda | 1 | 
| 2 | Mario | 1 | 

content_criteria ID相關聯:

| contentIdNum | criteriaIdNum | 

一個典型的記錄是這樣的:(這基本上是相關聯的內容與標準表並非所有內容與標準相關聯)

| 1 | 5 | 

** user_criteria:**

| userIdNum | criteriaIdNum | 

一個典型的記錄會是這樣的:(這基本上是一個將用戶與標準聯繫起來的表格。並非所有內容都與標準相關聯。)注意userIdNum 1具有相同的標準contentIdNum 1個

| 1 | 5 | 

** program_users:**

| userIdNum | criteriaIdNum | 

典型的記錄會是這樣(用戶1和2與方案1相關聯)

| 1 | 1 | 
| 2 | 1 | 

所以這裏就是我需要做的:

  • 創建一個MySQL調用返回的內容的所有作品,用戶可以訪問
  • 默認情況下,用戶可以訪問與他被分配到
  • 如果一份內容已經與相關標準的程序相關聯的所有內容它在content_criteria表,隨着user_criteria表中對應的標準,只有用戶可以訪問的內容
  • 例如,如果我通過在userIdNum 1,我應該得到的內容
  • 兩件如果我通過在userIdNum 2,我只能得到一個內容(contentIdNum爲2的那一個)

很明顯,選擇與用戶程序相匹配的內容很容易(下面是我的)。我試圖找出一種簡單的方法來過濾內容 - 我可以一次完成,還是必須執行第二遍並通過PHP循環訪問內容?

SELECT DISTINCT (c.contentIdNum), c.* 
FROM content c , program_users pu 
WHERE 1=1 
AND pu.userIdNum = 2 AND pu.programIdNum = c.programIdNum 

回答

0

感謝UNIONs修復它。 UNION的第一部分獲取所有沒有標準過濾的內容。如果用戶具有該條件,則UNION的第二部分將獲取具有過濾條件的所有內容。

SELECT c.* 
FROM content   c , 
     program_users  pu 
WHERE pu.userIdNum  = 1 
AND  pu.programIdNum = c.programIdNum 
AND NOT EXISTS (
    SELECT * 
    FROM content_criteria cc 
    WHERE cc.contentIdNum = c.contentIdNum 
) 
UNION 
SELECT c.* 
FROM content_criteria cc, users_criteria uc, content c 
WHERE cc.contentIdNum = c.contentIdNum 
AND cc.criteriaIdNum = uc.criteriaIdNum 
AND uc.userIdNum = 1 
0
SELECT c.* 
FROM content   c , 
     program_users  pu , 
     content_criteria cc, 
     user_criteria  uc 
WHERE pu.userIdNum  = 2 
AND  pu.programIdNum = c.programIdNum 
and  cc.contentIdNum = c.contentIdNum 
and  uc.criteriaIdNum = cc.criteriaIdNum 
and  uc.userIdNum  = pu.userIdNum 

應該做的伎倆。

「distinct」是隱藏錯誤的一種非常好的方式 - 尤其是當您仍然在設法確定您的查詢應該是什麼樣子的時候。

+0

感謝您的提示。不幸的是,這並不能解決問題。當我傳入2時,我沒有得到1的結果,因爲2在user_criteria表中沒有任何數據。如果我通過1,我只得到1項,我應該得到兩個。 – Khuffie

+0

即將建議工會 - 你擊敗了我! –