我正在构建一个基于mysql的聊天应用程序。
我的数据库架构包含以下表格,
Users Messages
================= =================
id id
screen_name message
from
to
timestamp
消息表中的from和to字段包含发送和接收每条消息的用户的ID。
我正在尝试显示用户($ id)和他们的一个朋友($ friend)之间的所有消息。我的查询如下:
$query = "SELECT messages.* , users.screen_name FROM users CROSS JOIN messages ";
$query .= "ON ( messages.to = $id AND messages.from = $friend ) ";
$query .= "OR ( messages.to = $friend AND messages.from = $id )";
问题是结果表中的每条消息都是两次。
我尝试使用DISTINCT,但它在这种情况下不起作用,或者我用错了。
我的查询应该是什么才能让两个用户之间只有一次消息?
答案 0 :(得分:3)
这样的事情可以解决问题:
SELECT
messages.*,
users_from.screen_name AS from_screen_name,
users_to.screen_name AS to_screen_name
FROM
messages
JOIN users AS users_from ON messages.from = users_from.id
JOIN users AS users_to ON messages.to = users_to.id
WHERE
(messages.to = $id AND messages.from = $friend)
OR ( messages.to = $friend AND messages.from = $id)
这样做的好处是两次加入“用户”表,一次在“到”列上,第二次在“从”列上。
答案 1 :(得分:1)
@Travesty3已经建议DISTINCT
关键字只会排除所有字段等于另一行的重复行。因此,DISTINCT
关键字不是此处的方式。
然而,您可以做的只是GROUP BY messages.id
,以便每个消息ID只能获得一行(但不能保证将排除这两行中的哪一行)。