Mysql 检查组对话中是否已存在线程

Mysql 检查组对话中是否已存在线程,mysql,Mysql,我有一个用户发送消息的平台。可以进行小组对话 我的线程成员表: id | user_id | thread_id ------------------------- 1 | 1 | 1 ------------------------- 2 | 2 | 1 ------------------------- 3 | 1 | 2 ------------------------- 4 | 2 |

我有一个用户发送消息的平台。可以进行小组对话

我的线程成员表:

id | user_id | thread_id 
------------------------- 
 1 |    1    |     1   
------------------------- 
 2 |    2    |     1  
------------------------- 
 3 |    1    |     2  
------------------------- 
 4 |    2    |     2  
------------------------- 
 5 |    3    |     2  
------------------------- 
 6 |    1    |     3  
------------------------- 
 7 |    3    |     3  
------------------------- 
 8 |    4    |     3  
当我发送消息时,我想检查这个线程是否已经存在

假设:用户\u id“1”向用户\u id“2”发送消息

结果应该是线程\u id“1”

它应该是一个查询

编辑 谢谢大家,但我想我得到了答案: 直到现在我才有任何问题

在PHP中:

$senderId = $_POST['sender']; // integer
$receiverIds = $_POST['receivers']; // array

$query = "SELECT thread_members.*, COUNT(*) 
          FROM thread_members 
          JOIN (   
            SELECT *, COUNT(*)   
            FROM (     
              SELECT *     
              FROM thread_members     
              WHERE user_id = " . $senderId . " "; 

              foreach ($receiverIds as $receiverId) 
              {
                $query .= " OR user_id = " . $receiverId . " ";  
              }

              $query .= " ) AS thread_members 
            GROUP BY thread_id 
            HAVING COUNT(*) = " . (count($receiverIds) + 1) . "
            ORDER BY COUNT(*) 
          ) AS thread_members_copy ON thread_members.thread_id = thread_members_copy.thread_id 
          GROUP BY thread_members.thread_id 
          HAVING COUNT(*) = " . (count($receiverIds) + 1) . "
          ORDER BY COUNT(*) ";

(count($receiverIds)+1)
是否所有接收者+发送者

您可以进行自连接,然后检查包含两个用户id值的记录:

SELECT t1.thread_id FROM
thread_members t1 INNER JOIN thread_members t2
ON t1.thread_id = t2.thread_id
WHERE t1.user_id = 1 AND t2.user_id = 2
给你:

void Main()
{
    var data = new List<Tuple<int, int, int>>{
        new Tuple<int,int,int>(1,1,1),
        new Tuple<int,int,int>(2,2,1),
        new Tuple<int,int,int>(3,1,2),
        new Tuple<int,int,int>(4,2,2),
        new Tuple<int,int,int>(5,3,2),
        new Tuple<int,int,int>(6,1,3),
        new Tuple<int,int,int>(7,3,3),
        new Tuple<int,int,int>(8,4,3),
    };

    var users = data.Select(x => x.Item2).Distinct();
    foreach(var user in users){
        var threads = data.Where(x => x.Item2 == user).Select(x => x.Item3);
        foreach(var thread in threads){
            var counterParties = data.Where(x => x.Item3 == thread && x.Item2 != user)
            .Select(x => x.Item2);
            foreach(var party in counterParties)
                Console.WriteLine("user {0} send thread {1} user {2}", user, thread, party);
        }
    }
}
void Main()
{
var数据=新列表{
新元组(1,1,1),
新元组(2,2,1),
新元组(3,1,2),
新元组(4,2,2),
新元组(5,3,2),
新元组(6,1,3),
新元组(7,3,3),
新元组(8,4,3),
};
var users=data.Select(x=>x.Item2.Distinct();
foreach(用户中的var用户){
var threads=data.Where(x=>x.Item2==user);
foreach(线程中的var线程){
var交易对手=数据。其中(x=>x.Item3==线程和x.Item2!=用户)
.选择(x=>x.Item2);
foreach(交易对手中的var方)
WriteLine(“用户{0}发送线程{1}用户{2}”,用户,线程,参与方);
}
}
}
结果是:

用户1发送线程1用户2
用户1发送线程2用户2
用户1发送线程2用户3
用户1发送线程3用户3
用户1发送线程3用户4
用户2发送线程1用户1
用户2发送线程2用户1
用户2发送线程2用户3
用户3发送线程2用户1
用户3发送线程2用户2
用户3发送线程3用户1
用户3发送线程3用户4
用户4发送线程3用户1
用户4发送线程3用户3


希望这能有所帮助。

谢谢,但我想提出一个问题。我的错,我没有提到。@del4y根据您的示例数据,线程1和线程2都有用户1和用户2相互通信。我错过什么了吗?您应该尝试使用一个简单的查询来解决您的问题。