繁体   English   中英

比较MySQL中的两个子查询

[英]Compare two subqueries in MySQL

我正在寻找完全匹配的列,这些列对一组相同的问题具有相同的答案。 他们的答案可能有所不同,我想找到两个人回答相同的答案,并且我想获得他们唯一的响应ID。

SELECT 
  response 
FROM 
  responses_questions 
WHERE (
  SELECT 
    answer 
  FROM 
    responses_questions 
  WHERE 
    response = '$my_response_id' 
  GROUP BY 
    question 
  ORDER BY 
    question 
  ASC
) = (
  SELECT 
    answer 
  FROM 
    responses_questions 
  GROUP BY 
    question 
  ORDER BY 
    question 
  ASC
)

我完全知道,上面的查询将无法工作。

主要问题是我需要将“标准查询”(由几行组成)与数据库的其余部分进行比较,以返回匹配的列组的响应ID。 基本上,对于每个问题,我都需要它们的所有答案都与我们要比较的“示例”查询相同。 “比较两个子查询”。

我可以轻松地形象化所需的数据; 尽管如此,SQL并未考虑人类“可视化”的内容...

如果我需要提供更多信息,请在下面的评论中告诉我。

编辑:屏幕截图/更多数据

这是一些示例数据的屏幕截图:

数据库实例 突出显示的数据是我们在上面查询的“第一”部分中正在选择的数据。 我需要找到所有匹配的数据。

我的预期输出应该是response列中的以下数字: 57 但不是6

请记住:会有数百个问题,因此有更多行要“比较”。 因此,请勿在其中硬编码任何特定的问题编号。

EDITED

我在第一次尝试回答时就意识到我误读了你的问题。 我认为您正在尝试找出哪些人获得了100%的收益,对吗? 让我知道我是否错。

SELECT b.response
FROM responses_questions b
LEFT JOIN responses_questions a 
    ON a.question = b.question
    AND a.answer = b.answer
    AND a.response = '$my_response_id'
    AND a.response != b.response
GROUP BY b.response
HAVING COUNT(DISTINCT a.question) = COUNT(DISTINCT b.question)

这是通过按每个人分组来获得每个人的问题和答案的集合而起作用的。 我们联接到该表的一个版本中,该版本仅具有您正在说的“示例”响应ID,并且联接时要使问题和答案都匹配。 我们使用LEFT JOIN,使任何不匹配项会对一个NULL a表。 最后,我们计算每个表中的条目数。 NULL条目不会添加到计数中,因此,如果有任何不匹配的行,则a表的计数将小于b表的计数。

顺便说一句,您正在将您的 '$my_response_id'卡在中间,这让我很警惕。 更好地使用准备好的查询。 我希望您正在清理您的输入。 - 好极了!

编辑

我添加了一个检查以确保它也不会返回“示例” ID4。它应该可以正常工作。 我做了一个sqlfiddle并按照您的要求得到了5和7。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM