用于根据两个表行确定true / false的SQL

时间:2017-11-14 17:57:05

标签: mysql sql

考虑一个表,该表包含提交表单上每个字段的行。

CREATE TABLE `FormResponses` (
  `responseID` char(35) COLLATE utf8_unicode_ci DEFAULT NULL,
  `formID` char(35) COLLATE utf8_unicode_ci DEFAULT NULL,
  `formField` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `formValue` longtext COLLATE utf8_unicode_ci  
) 

如果提交的表单有2个字段(user_id和audio_file_id),则会有两行,两行都具有相同的responseID和formId。

现在,我需要查询表以确定user_id是否已提交特定audio_file_id的表单(以防止重复提交音频文件,同时允许使用相同表单提交其他音频文件)。

伪查询可能如下所示:

SELECT responseId
FROM FormResponses
WHERE formId = FORM_ID_VALUE AND EXISTS 


( SELECT responseID 
  FROM FormResponses 
  WHERE formField = "user_id" AND formValue = USER_ID_VALUE

AND

 SELECT responseID
 FROM FormResponses
 WHERE formField = "audio_file_id" AND formValue = AUDIO_FILE_ID_VALUE AND responseID = RESPONSE_ID_OF_USER_ID_QUERY_ABOVE

)

基本上,简单的英语查询将“给我formdd = 123的两行的响应ID,这两行中的一行表示user_id为456,而这两行中的另一行表示audio_file_id为789 。“

值得注意的是:如果用户为两个不同的音频文件提交相同的表单,则这两个提交的responseID将不同,但formID将是相同的。

我希望我能够清楚地提出这个问题......希望解释比解决更难!

1 个答案:

答案 0 :(得分:0)

每当你必须在同一个表中组合来自两行的数据时,你就会进行自动连接,即你查询表两次,并将它们称为例如a和b。然后从表a中获取一行,从表b中获取另一行。如果满足所有条件,您将得到一个结果行:

SELECT a.responseId
FROM FormResponses a 
JOIN FormResponses b
ON a.formId = b.formId
AND a.responseId = b.responseId
WHERE a.formId = FORM_ID_VALUE
AND a.formField = 'user_id'
AND a.formValue = USER_ID_VALUE
AND b.formField = 'audio_file_id'
AND b.formValue = AUDIO_FILE_ID_VALUE