2012-10-31 137 views
1

我現在在一個複雜的MySQL查詢中搜索很多次。MySQL:複雜的查詢動態選擇?

這是一個成就係統。

表結構簡單,形式是對稱的。

第一個表(achievements_base)包含成就參考:每個成就有: - 一個ID(行的ID,自動遞增&唯一的), - 一個code_id(業績基準), - 一個rank_id(成就的子類別code_id), - 以及成就名稱(顯示用途)。

第二個表(achievements_user)包含由用戶獲得的成就:每個解鎖成就具有: - 的ID(如果行,自動遞增&獨特的), - 所述code_id(實現的參考) , - 一個rank_id(成就的code_id的子分類), - 和用戶ID。

的表格語法是:

achievements_base 
id - code_id - rank_id - name 
1 - 1 - 1 - foo 
2 - 1 - 2 - bar 
3 - 1 - 3 - foobar 
4 - 1 - 4 - foofoo 
5 - 2 - 1 - barbar 

achievements_user 
id - code_id - rank_id - user_id 
1 - 1 - 1 - 1 
2 - 1 - 2 - 1 
3 - 2 - 1 - 1 

我想顯示的成績是用戶沒有(GROUP BY code_id)

In the table exemple above, for example, expected result is, for the user_id 1 : 
3 - 1 - 3 - foobar 

但我不明白該怎麼做!我已經嘗試了多個查詢。

對不起,我是法國人!

謝謝!

編輯,例如查詢之一的,我試過:

SELECT AB.name 
FROM achievements_base AB 
RIGHT JOIN achievements_users AU 
ON AU.code_id = AB.code_id AND AU.rank_id = AB.rank_id 
WHERE (SELECT COUNT(*) FROM achievements_users AU WHERE AU.user_id = 1) = 0 
GROUP BY AB.code_id 
ORDER BY AB.code_id ASC 
+1

[告訴我們你試過的東西。](http://www.whathaveyoutried.com) – Kermit

+0

對不起,已更新! –

回答

1

怎麼樣以下?

SELECT code_id 
FROM achievements_base 
WHERE code_id NOT IN 
( 
    SELECT code_id 
    FROM achievements_user 
    WHERE user_id = 1 
) 
GROUP BY code_id 
+1

WHERE NOT IN是好的語法,它是有效的!非常感謝 ! ;) –

+0

仔細檢查這裏..這將僅檢查code_id,而不是code_id和rank_id的組合。我不確定這是否可以接受您的目的。如果是的話,太棒了! :) – DevlshOne

1
SELECT ab.* 
FROM achievements_base ab 
LEFT OUTER JOIN achievements_user au 
ON ab.id = au.code_id 
WHERE au.user_id = {userid} 

未經檢驗的,而且我剛纔學習的聯接,但外連接,絕對是你想要去什麼。

+1

沒有抱歉外連接不是解決方案;) –

0

這樣的事情呢? 編輯這應該做的伎倆..

SELECT 
    * 
FROM 
    achievements_base 
WHERE id NOT IN 
    (SELECT 
     ab.id 
    FROM 
     achievements_base ab 
     RIGHT JOIN achievements_user au 
      ON (
       ab.code_id = au.code_id 
       AND ab.rank_id = au.rank_id 
      ) 
    WHERE au.user_id = 1) 
+0

同上,也謝謝! :) –