0

プロジェクトIDを生成するだけのテーブルがあります。project_tableproject_idおよびその他の列があります。

toと1列のproject_members2つの列project_idを持つ別のテーブルがあります。FOREIGN KEYproject_tableuser_id

ユーザーのセット(コンマ区切り値として渡される)が同じに該当するかどうかを知りたいですproject_id

例-project_membersテーブルには次のエントリがあります

project_id user_id
         1       1
         1       2
         2       3
         2       4
         2       1

私が合格したとき、私はこれらのユーザーがid's 1,2どのユーザーであるかを知りたいですproject_id。また、条件はids 1 and 2そのプロジェクトにのみ存在する必要があるということです。

したがって、上記のデータの入力と出力は次のようになります-

input output
1,2        1
1,2,3   NONE
1,3,4      2
1,2,4   NONE.

どうしてそれは可能ですか?

4

1 に答える 1

3
SELECT   project_id
FROM     project_members
WHERE    user_id IN (1,3,4)
GROUP BY project_id
HAVING   COUNT(*) = 3

sqlfiddleでそれを参照してください。

(project_id, user_id)これは、に重複レコードがないことを前提としていることに注意してくださいproject_members。重複がある場合は、のCOUNT(DISTINCT user_id)代わりに、より高価なものを使用する必要がありますCOUNT(*)


ストアドプロシージャ内でこの操作を実行する必要がある場合FIND_IN_SET()は、演算子の代わりにMySQLの関数を使用して、コンマをすべて削除した入力文字列の長さを差し引いたIN合計からカウントを計算できます。CHAR_LENGTH()

CREATE PROCEDURE get_projects(IN members TEXT)
SELECT   project_id
FROM     project_members
WHERE    FIND_IN_SET(user_id, members)
GROUP BY project_id
HAVING   COUNT(*) = 1 + CHAR_LENGTH(members)-CHAR_LENGTH(REPLACE(members,',',''));

これは、コンマで区切られた個別のmembers値が含まれ、他のパディングや余分なコンテンツが含まれていないことを前提としていることに注意してください。 user_id


指定された正確なメンバーを含むプロジェクトを見つけるには、代わりに次の操作を行うことができます。

SELECT   project_id
FROM     project_members
GROUP BY project_id
HAVING   COUNT(*) = 3
     AND NOT SUM(user_id NOT IN (1,3,4))

手続き型は次のようになります。

CREATE PROCEDURE get_projects(IN members TEXT)
SELECT   project_id
FROM     project_members
GROUP BY project_id
HAVING   COUNT(*) = 1 + CHAR_LENGTH(members)-CHAR_LENGTH(REPLACE(members,',',''))
     AND NOT SUM(FIND_IN_SET(user_id, members)=0);
于 2012-08-31T16:38:09.700 に答える