在此示例中避免嵌套循环

时间:2014-07-17 16:59:17

标签: mysql

我正在尝试创建一个facebook风格的消息系统,两个或更多用户可以进行对话。在此消息传递系统中,用户应该能够离开对话,而不会为其他参与者删除对话。

为了做到这一点,我制作了一组这样的表:

User-table
+---------+----------+
| user_id | username |
+---------+----------+
|       1 | john     |
|       2 | marc     |
|       3 | vince    |
+---------+----------+

Conversation-table
+-----------------+-------------------+---------------+
| conversation_id | newest_message_id | message_count |
+-----------------+-------------------+---------------+
|               1 |                 7 |             7 |
|               2 |                13 |             6 |
|               3 |                56 |            43 |
+-----------------+-------------------+---------------+

Message-table
+------------+---------+---------------------------------+
| message_id | user_id |             message             |
+------------+---------+---------------------------------+
|          1 |       3 | "Yea, i really like him a lot." |
|          2 |       5 | "Let's meet up later!"          |
|          3 |      13 | "Wow, thanks!"                  |
+------------+---------+---------------------------------+

Conversation_users-table
+----+-----------------+---------+
| id | conversation_id | user_id |
+----+-----------------+---------+
|  1 |               1 |       3 |
|  2 |               1 |       1 |
|  3 |               1 |       2 |
|  4 |               2 |       5 |
|  5 |               3 |      13 |
+----+-----------------+---------+

在我的界面中,我希望显示用户当前参与的所有会话以及其他参与者的用户名。

为了做到这一点,我必须从用户参与的conversation_user-table中获取所有的对话ID,然后再次通过表格获取用户ID'这些对话的所有其他参与者都是。

它适用于这样的子查询:

SELECT user_id, conversation_id FROM conversation_users WHERE conversation_id IN (SELECT conversation_id FROM conversation_users WHERE user_id = 1)

但我担心嵌套查询会大大降低性能。

有更好的方法来进行此查询吗?

此致

0 个答案:

没有答案