1

複雑なMySQLクエリを何度も検索しています。

それは達成システムです。

テーブルの構造は単純で、形式は対称的です。

最初のテーブル(achievements_base)には、アチーブメント参照が含まれています:各アチーブメントには次のものがあります:-ID(行のID、自動インクリメント&一意)、-code_id(アチーブメントの参照)、-rank_id(アチーブメントのサブカテゴリcode_id)、-およびアチーブメント名(表示目的)。

2番目のテーブル(achievements_user)には、ユーザーによって取得されたアチーブメントが含まれます。ロック解除された各アチーブメントには、次のものがあります。 -実績の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

しかし、私はそれを行う方法がわかりません!私はすでに複数のクエリを試しました。

英語でごめんなさい、私はフランス語です!

ありがとう !

編集、私が試したクエリの1つの例:

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
4

3 に答える 3

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

テストされておらず、私は今結合を学んでいますが、外部結合は間違いなくあなたが行きたいものです。

于 2012-10-31T00:36:02.963 に答える
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
于 2012-10-31T00:37:28.700 に答える
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)
于 2012-10-31T00:37:00.780 に答える