0

これが私の投稿モデルです。投稿には、投稿を通じて多くの user_id があります。user_id が 2 と 3 の投稿を返したいので、ID が 7 と 8 の投稿を返します。

理想的には、私のコードは次のようになります...しかし、うまくいきません

Post.joins(:postings).where("postings.user_id = ?", [2,3])

id  | post_id | user_id | created_at                | updated_at                |
+---+---------+--------+---------------------------+---------------------------+
| 1 | 7       | 1      | 2013-09-07 16:03:50 -0400 | 2013-09-07 16:03:50 -0400 |
| 2 | 7       | 2      | 2013-09-07 16:03:50 -0400 | 2013-09-07 16:03:50 -0400 |
| 3 | 7       | 3      | 2013-09-07 16:03:50 -0400 | 2013-09-07 16:03:50 -0400 |
| 4 | 8       | 2      | 2013-09-07 22:17:49 -0400 | 2013-09-07 22:17:49 -0400 |
| 5 | 8       | 3      | 2013-09-07 22:17:49 -0400 | 2013-09-07 22:17:49 -0400 |
| 6 | 8       | 6      | 2013-09-07 22:17:49 -0400 | 2013-09-07 22:17:49 -0400 |
| 7 | 12      | 3      | 2013-09-14 12:49:56 -0400 | 2013-09-14 12:49:56 -0400 |

追加コメント

  • 私はRailsを使用しています
  • [2,3] を動的に維持できるようにしたいので、配列に 10 個のエントリまたは 2 個のエントリを含めることができます。

  • Post テーブルには user_id 列がありません。Posting モデルには user_id 列があり、User テーブルには id 列があります。2 つの間の関係は、has_many 関係を使用してセットアップされています。

4

1 に答える 1

1

私はこれらの問題を、節にロジックを含む集約を使用して解決するのが好きhavingです。これが、これらのタイプの質問に対する最も柔軟なアプローチだからです。

select post_id
from postings
group by post_id
having sum(case when user_id = 2 then 1 else 0 end) > 0 and
       sum(case when user_id = 3 then 1 else 0 end) > 0;

句の各条件は、having各ユーザー ID に一致するレコードの数をカウントしています。

編集:

テーブルにあるインデックスによっては、この特定の問題に対して次の方法が実際にうまく機能する場合があります。

select p2.user_id
from postings p2 join
     postings p3
     on p2.post_id = p3.post_id and
        p2.user_id = 2 and
        p3.user_id = 3;

編集II:

動的リストの場合、次のことができます。

select post_id
from postings
where user_id in (2, 3, 4, 5, 6)
group by post_id
having count(distinct user_id) = 5;
于 2013-09-18T03:15:34.183 に答える