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

単一のSQLクエリを介して同じデータベーステーブル内の共通レコードを取得するにはどうすればよいですか?

    これは、必要なものを引き出すためのraw-sqlの方法だと思います:

    select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 2;
    

    RailsでユーザーIDを置き換えることができる場所:

    ArticlesUser.find_by_sql(["select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = ?) and user_id = ?", @user1.id, @user2.id])
    

    または複数のIDの場合::

    ArticlesUser.find_by_sql(["select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = ?) and user_id IN (?)", @user1.id, [@user2.id,@user3.id]])
    

    したがって、サンプルデータから(他の質問から):

    mysql> select * from articles_users;
    +----+---------+------------+
    | id | user_id | article_id |
    +----+---------+------------+
    |  1 |       1 |          1 |
    |  2 |       1 |          2 |
    |  3 |       1 |          3 |
    |  4 |       2 |          1 |
    |  5 |       2 |          2 |
    |  6 |       3 |          1 |
    |  7 |       3 |          3 |
    |  8 |       4 |          4 |
    +----+---------+------------+
    8 rows in set (0.00 sec)
    

    したがって、値が返されます:

    mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 2;
    +----+---------+------------+
    | id | user_id | article_id |
    +----+---------+------------+
    |  4 |       2 |          1 |
    |  5 |       2 |          2 |
    +----+---------+------------+
    2 rows in set (0.00 sec)
    
    mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 3;
    +----+---------+------------+
    | id | user_id | article_id |
    +----+---------+------------+
    |  6 |       3 |          1 |
    |  7 |       3 |          3 |
    +----+---------+------------+
    2 rows in set (0.00 sec)
    

    または複数のユーザーIDの場合:

    mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id in (2,3);
    +----+---------+------------+
    | id | user_id | article_id |
    +----+---------+------------+
    |  4 |       2 |          1 |
    |  5 |       2 |          2 |
    |  6 |       3 |          1 |
    |  7 |       3 |          3 |
    +----+---------+------------+
    4 rows in set (0.00 sec)
    

    あなたはSQLの方法を求めてきましたが、これを行うにはほぼ確実に手ごわい方法があります...しかし、これで始められるはずです。ここからリファクタリングできます。




    1. あるphpファイルでmysqli接続を定義し、それを別のファイルで使用するにはどうすればよいですか?

    2. LIKEフィルターでアンダースコア文字を使用するとすべての結果が得られるのはなぜですか?

    3. 悪いスタンバイ

    4. hasmany関係によるLaravelの注文