Mysql 检查是否存在多条id相同的记录

Mysql 检查是否存在多条id相同的记录,mysql,sql,select,group-by,Mysql,Sql,Select,Group By,我正在尝试检查聊天参与者表中(?,?)中是否存在多条pageId为的记录 这是表格结构的一个示例: 这是我尝试过的SQL查询: SELECT chatId FROM chatParticipants GROUP BY chatId HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','123')) = 0 预期行为: 如果已经存在与给定(x)个参与者的对话,即具有相同的chatId值,则必须返回chatId值 上面的SQ

我正在尝试检查
聊天参与者
表中(?,?)中是否存在多条pageId为
的记录

这是表格结构的一个示例:

这是我尝试过的SQL查询:

SELECT chatId FROM chatParticipants GROUP BY chatId
HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','123')) = 0
预期行为:

  • 如果已经存在与给定(x)个参与者的对话,即具有相同的
    chatId
    值,则必须返回
    chatId
上面的SQL确实有效,有两个输入。但是,下面的查询仍然返回
chatId
,它不应该返回。(因为它的“144”不是参与者)

你知道为什么会这样吗?我只想得到一个输出,如果查询中的所有参与者都匹配,并且具有相同的chatId

编辑2:

此SQL将返回两个聊天ID

SELECT chatId FROM chatParticipants WHERE pageId 
IN ('123','deb47fba9bc6936ed76e831578baa480') GROUP BY chatId HAVING COUNT(*) = 2 
输出:

016030f5ba6d47c31f7f22d92507faf1
43bcd7340f1abf7eda09fcccffdbfe60
实际上,预期的输出应该只返回
43bcd7340f1abf7eda09fcccffdbfe60的聊天id


有什么想法吗?

您可以使用
WHERE
子句在您感兴趣的页面列表中进行筛选,然后确保所有页面都包含
HAVING
子句:

SELECT chatId 
FROM chatParticipants 
WHERE pageId IN ('deb47fba9bc6936ed76e831578baa480','123', '144')
GROUP BY chatId
HAVING COUNT(*) = 3

这假定每个
chatId
没有重复的
pageId
。否则,您可以使用
COUNT(DISTINCT pageID)
而不是
COUNT(*)

您可以使用
WHERE
子句在您感兴趣的页面列表中进行筛选,然后确保所有页面都包含
HAVING
子句:

SELECT chatId 
FROM chatParticipants 
WHERE pageId IN ('deb47fba9bc6936ed76e831578baa480','123', '144')
GROUP BY chatId
HAVING COUNT(*) = 3

这假定每个
chatId
没有重复的
pageId
。否则,您可以使用
COUNT(DISTINCT pageID)
而不是
COUNT(*)

这能解决您的问题吗

SELECT chatId FROM chatParticipants WHERE chatId IN (
  SELECT chatId FROM chatParticipants WHERE pageId
  IN ('123','deb47fba9bc6936ed76e831578baa480') GROUP BY chatId HAVING COUNT(*) = 2
) GROUP BY chatId HAVING COUNT(*) = 2

希望这有帮助。

这能解决您的问题吗

SELECT chatId FROM chatParticipants WHERE chatId IN (
  SELECT chatId FROM chatParticipants WHERE pageId
  IN ('123','deb47fba9bc6936ed76e831578baa480') GROUP BY chatId HAVING COUNT(*) = 2
) GROUP BY chatId HAVING COUNT(*) = 2

希望这有帮助。

您可以用逗号分隔的列表替换
中运算符
pageId
s列表,并使用
GROUP\u CONCAT()

您可以删除
DISTINCT
,因为每个
chatId
都没有重复的
pageId
s
逗号分隔列表中的值必须按字母顺序排序。

或者使用使用
UNION ALL
返回搜索的
pageId
s的子查询:

SELECT chatId
FROM chatParticipants 
GROUP BY chatId
HAVING GROUP_CONCAT(DISTINCT pageId ORDER BY pageId) = (
  SELECT GROUP_CONCAT(pageId ORDER BY pageId) FROM (
    SELECT '123' pageId UNION ALL 
    SELECT '144' UNION ALL
    SELECT 'deb47fba9bc6936ed76e831578baa480' 
  ) t
) 

在这种情况下,
pageId
s的顺序并不重要,因为它们稍后按
GROUP_CONCAT()

排序。您可以用逗号分隔的列表替换
中运算符
pageId
列表,并使用
GROUP_CONCAT()

您可以删除
DISTINCT
,因为每个
chatId
都没有重复的
pageId
s
逗号分隔列表中的值必须按字母顺序排序。

或者使用使用
UNION ALL
返回搜索的
pageId
s的子查询:

SELECT chatId
FROM chatParticipants 
GROUP BY chatId
HAVING GROUP_CONCAT(DISTINCT pageId ORDER BY pageId) = (
  SELECT GROUP_CONCAT(pageId ORDER BY pageId) FROM (
    SELECT '123' pageId UNION ALL 
    SELECT '144' UNION ALL
    SELECT 'deb47fba9bc6936ed76e831578baa480' 
  ) t
) 

在这种情况下,
pageId
s的顺序并不重要,因为它们稍后按
GROUP_CONCAT()

进行排序,但不确定为什么
SUM()
用于包含非数字的列data@RiggsFolly:this
SUM
s布尔条件-在MySQL中,这是可以的。@GMB在所有的好日子里都学到了一些东西:)你的MySQL版本是什么?不确定为什么是
SUM()
用于包含非数字的列data@RiggsFolly:this
SUM
s布尔条件-在MySQL中,这是可以的。@GMB在所有的好日子里都学到了一些东西:)你的MySQL版本是什么。嘿,这个查询似乎得到了多个chatid,假设页面(A,B)在它自己的对话中,而(A,B,C)在另一个对话中。我已经更新了桌子的图像,你知道如何解决这个问题吗?谢谢..还尝试按照您的建议使用计数(不同的pageId),但仍然返回相同的输出。嘿,这个查询似乎得到了多个chatid,假设页面(A,B)在它自己的对话中,而(A,B,C)在另一个对话中。我已经更新了桌子的图像,你知道如何解决这个问题吗?谢谢。我也尝试过按您的建议使用计数(不同的pageId),但仍然返回相同的输出。嗨,Daniele。原因是,我想检查X个参与者之间是否存在具有相同聊天ID的对话,以重定向到该对话,而不是创建一个新的对话。如果用户A想与B(仅)开始聊天,则不应重定向到可能的用户A、B、C所在的聊天。希望这是有意义的。非常清楚@Anders。你能检查一下我编辑过的答案吗?刚刚试过,似乎效果不错。是否可以将其转换为单个查询(而不是两个单独的SELECT)?可能在性能方面并不意味着什么,但只是想检查一下。尽管如此,它似乎解决了我提出的问题,upvote和mark也将解决这个问题。再次感谢。:)你好,丹尼尔。原因是,我想检查X个参与者之间是否存在具有相同聊天ID的对话,以重定向到该对话,而不是创建一个新的对话。如果用户A想与B(仅)开始聊天,则不应重定向到可能的用户A、B、C所在的聊天。希望这是有意义的。非常清楚@Anders。你能检查一下我编辑过的答案吗?刚刚试过,似乎效果不错。是否可以将其转换为单个查询(而不是两个单独的SELECT)?可能在性能方面并不意味着什么,但只是想检查一下。尽管如此,它似乎解决了我提出的问题,upvote和mark也将解决这个问题。再次感谢。:)谢谢你的建议。我以前也试过类似的方法。您建议如何使用逗号分隔的字符串编写准备好的语句以防止攻击?名单的顺序有什么意义吗?页面id不是我预先选择的,因为它们对用户的选择是动态的,并且可能有不同的顺序