0

我有一个消息表:

messages:
    id(int)
    send_id(int)
    receive_id(int)

我希望只有当 a->b 和 b->a 存在时才能从中选择行,例如:

    id     send_id recieve_id
    0,     15,     16
    1,     16,     15

因此,基本上一条消息已传递给每个人。我如何能够只选择这两行中的一个(发送或接收),以及所有用于特定 ID 的行。

我只想返回具有这种二元性的结果。

我的代码目前使用嵌套SELECT,并且根本无法根据需要工作。

4

2 回答 2

2

您可以通过利用 MySQLLEASTGREATEST内置函数来实现结果。

SELECT  *
FROM    messages
WHERE   (LEAST(send_id, recieve_id), GREATEST(send_id, recieve_id), id)       
IN 
(
    SELECT  LEAST(send_id, recieve_id) as x, 
            GREATEST(send_id, recieve_id) as y, 
            MAX(id) msg_ID
    FROM    messages 
    GROUP   BY x, y
);
于 2013-02-22T06:19:18.937 回答
1

您必须为此定义一个额外的合成列。不同的选择:永久作为索引(快速),如果仅用于每月一次的选择或在实际查询中即时选择,则为临时的。

不管有什么选择,该列都应该包含两个 id,以数字方式排序并连接起来,可能通过一些分隔字符,如-. 现在,当您对该列进行唯一性限制时,只有两个候选者中的一个可以输入结果,第二个被拒绝,因为它会违反该唯一性规则。

诀窍是有序连接而不是正常的组合索引,由于 id 的不同顺序,这将允许两种变体。

于 2013-02-22T06:18:33.587 回答