Đây là một cách thô sơ để rút ra những gì bạn muốn, tôi nghĩ:
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;
Nơi bạn có thể thay thế id người dùng trong Rails:
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])
Hoặc cho nhiều 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]])
Vì vậy, từ dữ liệu mẫu (từ các câu hỏi khác của bạn):
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)
Do đó, nó sẽ trả về các giá trị:
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)
Hoặc cho nhiều id người dùng:
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)
Bạn đã yêu cầu một cách sql - nhưng gần như chắc chắn có một cách khó để làm điều này ... nhưng điều này sẽ giúp bạn bắt đầu và bạn có thể cấu trúc lại nó từ đây.