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相互通信。我错过什么了吗?您应该尝试使用一个简单的查询来解决您的问题。