Mysql facebook样式消息加入3个表

时间:2013-07-22 14:51:53

标签: php mysql

//USER TABLE
user_id name
1       ben
2       alex
3       john

//CONVERSION TABLE
c_id    user_one    user_2
1       2(alex)     1(ben)
2       2(alex)     3(john)
3       1(ben)      3(john)

//MESSAGE TABLE
m_id    c_id    send        receive     message
1       1       2(alex)     1(ben)      hi ben
2       1       2(alex)     1(ben)      ben, u there?
3       2       1(ben)      3(john)     whatever...

//QUERY 1
SELECT * FROM conversion WHERE user_one=1(ben)
OR user_two=1(ben)

所以现在我知道本有2次对话(其中一次与亚历克斯的另一次约会)

我的问题是 如何加入3个表并像这样取出

conversation_1 - Alex(id = 2) - cv_1中的最后一条消息(本,你呢?)

conversationi_3 - 约翰(id = 3) - cv_3中的最后一条消息(无论如何......)

喜欢facebook消息

1 个答案:

答案 0 :(得分:2)

主要思想是你必须使用连接。标准的JOIN语法在这里没有帮助,因为你不能在JOIN ... ON中使用OR语句。但是像这样的事情会起到作用

SELECT c.c_id, u.user_id, u.name, MAX(m_id), message FROM message m, conversation c, user u
WHERE m.c_id = c.c_id
AND
(
c.user_one = u.user_id
OR
c.user_2 = u.user_id
)
GROUP BY c.c_id

这里我们将3个表连接在一起,获取最大的消息ID(我假设ID是自动增量的,因此可以安全地假设消息较旧的ID越高)并按对话ID分组。这就是我们如何获得最早的消息和会话详细信息,其中涉及Ben(例如登录用户)

我在http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/之前看到堆栈溢出的某个好文章。目前的方法是INNER JOIN。

SQL小提琴 - http://sqlfiddle.com/#!2/ae6e6/14