//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消息
答案 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