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:thisSUM
s布尔条件-在MySQL中,这是可以的。@GMB在所有的好日子里都学到了一些东西:)你的MySQL版本是什么?不确定为什么是SUM()
用于包含非数字的列data@RiggsFolly:thisSUM
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不是我预先选择的,因为它们对用户的选择是动态的,并且可能有不同的顺序