Mysql 如何获取包含双id引用的行

Mysql 如何获取包含双id引用的行,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有一个消息表: 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的所有行 我只想返回具有这种二元性的结果 “我的代码”

我有一个消息表:

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
,根本无法根据需要工作。

您必须为此定义一个额外的合成列。不同的选择:永久作为索引(fast),临时(如果只是一个月一次的选择)或在实际查询中动态进行

无论如何,该列都应该包含两个ID,以数字方式排序并连接,可能通过一些分隔字符,如
-
。现在,当您对该列进行唯一性限制时,两个候选列中只有一个可以输入结果,第二个将被拒绝,因为它将违反唯一性规则


诀窍是有序串联,而不是正常的组合索引,因为ID的顺序不同,这将允许两种变体

您必须为此定义一个额外的合成列。不同的选择:永久作为索引(fast),临时(如果只是一个月一次的选择)或在实际查询中动态进行

无论如何,该列都应该包含两个ID,以数字方式排序并连接,可能通过一些分隔字符,如
-
。现在,当您对该列进行唯一性限制时,两个候选列中只有一个可以输入结果,第二个将被拒绝,因为它将违反唯一性规则


诀窍是有序串联,而不是正常的组合索引,因为ID的顺序不同,这将允许两种变体

您可以利用MySQL的
最小
最大
内置函数来实现这一结果

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
);

您可以通过利用MySQL的
最小的
最大的
内置功能来实现这一结果

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
);

与我的尝试相比,这非常棒,非常优雅。我特别喜欢这个最小/更大的想法——我知道必须有一个体面的解决方案。如果可以的话,我会两次接受你的回答。我必须停止将SQL看作一种简单的语言,而使用/思考其中的一些列表结构。谢谢。这很好,和我的尝试相比非常优雅。我特别喜欢这个最小/更大的想法——我知道必须有一个体面的解决方案。如果可以的话,我会两次接受你的回答。我必须停止将SQL看作一种简单的语言,而使用/思考其中的一些列表结构。谢谢。谢谢你的建议。我实现了上面JW的答案,该答案使用了一个基于min/max的临时列,但这种方法可能也适用。唯一性限制是什么意思?要么将列声明为唯一索引,然后RDBMS负责拒绝双条目,要么在嵌套的
SELECT
语句中使用
groupby
操作数。结果是一样的。我引用“拒绝双重输入的一些方法”来保持列输入的唯一性。谢谢您的建议。我实现了上面JW的答案,该答案使用了一个基于min/max的临时列,但这种方法可能也适用。唯一性限制是什么意思?要么将列声明为唯一索引,然后RDBMS负责拒绝双条目,要么在嵌套的
SELECT
语句中使用
groupby
操作数。结果是一样的。我提到了“拒绝双重输入的一些方法”,以保持列输入的唯一性。