比较MySQL中的两个子查询

时间:2014-01-24 22:08:07

标签: php mysql mysqli

我希望找到与一组相同问题具有相同答案的完全匹配列。他们的答案可能会有所不同,我想找到两个人回答相同的答案,我想得到他们唯一的回复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
)

我完全清楚上面的查询将 NOT 工作。

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

我可以轻松地查看我需要获取的数据;尽管如此,SQL没有考虑到我们人类“可视化”的内容......

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

编辑:截图/更多数据

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

Database Example 突出显示的数据是我们在上面查询的“第一”部分中选择的内容。我需要找到MATCHES的所有数据。

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

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

1 个答案:

答案 0 :(得分:1)

<强> 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的表格版本,我们加入使得问题和答案都匹配。我们使用左连接,以便任何不匹配的条目在a表上具有NULL。最后,我们计算每个表中的条目数。 NULL条目不会添加到计数中,因此如果存在任何不匹配的行,则a表的计数将小于b表的计数。

顺便说一下,你让我警惕你'$my_response_id'卡在中间。最好使用准备好的查询。我希望你正在消化你的投入。 - 耶!

修改

我添加了一张检查,以确保它不会返回4的“示例”ID。它应该可以正常工作。我做了一个sqlfiddle,就像你要求的那样得到5和7。