sql >> データベース >  >> RDS >> PostgreSQL

多対多の関係で一致するサブセットを選択する

    Select project_ID 
    from user_projects
    where user_ID in (1,2)
    group by project_ID
    Having count(*) = 2
    

    2人のユーザーがいて、それらが一意(主キー)になることを知っているので、同じプロジェクトに対して2つのレコードがある場合、それが必要なものであることがわかります。

    あなたの質問は、あなたが与えられたユーザーの送信を持っていることを示しました。そのため、あなたはどのユーザーと何人のユーザーがいるかを知っています。上記のSQLは、これらの既知のパラメータを受け入れるように更新できるため、2人のユーザーだけに限定されることなく、動的なままです。

    where user_ID in (userlist)
    having count(*) = (cntuserList)
    

    -----------ユーザーのセットが空の場合の状況を処理するには-----

    Select P.project_ID 
    from Projects P
    LEFT JOIN user_projects UP
    where (UP.user_ID in (1,2) OR UP.USER_ID is null)
    group by project_ID
    Having count(*) = 2
    

    これが何をするのかです。すべてのプロジェクトを返し、そのプロジェクトに関連付けられているユーザーがいる場合はそれらを識別します。セットにユーザーが含まれている場合、返されるプロジェクトのリストはそのセットによってフィルタリングされ、セット全体がhave句を介してプロジェクトに含まれるようになります。

    >

    セットが空の場合、userID is nullステートメントとともにLEFT結合は、セットが空であるかどうかに関係なく、ユーザーがリストされていないプロジェクトを保持します。持つ句は、セットをさらにセットで定義したユーザーの数に減らします。または0は、ユーザーが割り当てられていないすべてのプロジェクトを返すことを示します。

    まだ説明しなかったもう1つのエッジケースは、プロジェクトにセットで定義したよりも多くのユーザーが含まれている場合にどうなるかです。現在、このプロジェクトは返還されます。しかし、私はそれがあなたが望んでいたことであるとは確信していません。

    ちなみに私に考えさせてくれてありがとう。私はもうコードに入ることができません。だから私は時々ここをトロールして助けてくれるかどうか確かめます!



    1. mysql列エイリアスが機能しないため、機能させるには空の連結を作成する必要があります

    2. MySQLリレーショナル除算(INORではなくINAND)の実装におけるパフォーマンスの違いは何ですか?

    3. 従来のAPIを使用したMySQLクエリが成功したかどうかを確認するにはどうすればよいですか?

    4. ユーザー'root'@'localhost'のアクセスが拒否されました(パスワードを使用:YES)