0
//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 - John(id=3) - cv_3 中的最后一条消息(无论如何...)

喜欢脸书消息

4

1 回答 1

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

于 2013-07-22T15:01:29.933 回答