考虑一个表,该表包含提交表单上每个字段的行。
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将是相同的。
我希望我能够清楚地提出这个问题......希望解释比解决更难!
答案 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