仅显示mysql中的唯一条目

时间:2012-04-10 13:27:39

标签: php mysql

我正在构建一个基于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,但它在这种情况下不起作用,或者我用错了。

我的查询应该是什么才能让两个用户之间只有一次消息?

2 个答案:

答案 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只能获得一行(但不能保证将排除这两行中的哪一行)。