在MYSQL表中查找重复项,其中数据位于多个表中(需要多个条件)

时间:2013-09-15 12:41:00

标签: mysql sql duplicates

我对MYSQL的了解非常基础,我将非常感谢以下方面的帮助:

  

子记录架构

     

id |记录|元素|标题|名字|类型|值

上表存储了通过网络表单提交的数据。

  • 每行是一个字段(即“电话号码”,“电子邮件”,“主题”等)。其中“title”是字段的标签,“value”是提交字段的内容
  • “记录”标识每个唯一提交的表单,它是下面澄清的“记录”表(records.id)的外键(同一表单提交多次生成多个唯一记录)
  • 要知道提交了哪个表单,我们需要查看另一个表格
  

记录架构

     

id |提交|形式|标题|名称

  • id对每个提交都是唯一的(不是每个表单都是唯一的,多次提交的相同表单会生成多个唯一ID)
  • form是另一个表(forms.id)的外键,它定义了表单的结构(所有字段等等),并没有真正简化检索我需要的数据。
  • records.name是一个标识每个唯一表单的文本字符串,这是选择我们要查找的表单所必需的

我需要找到多次提交相同表单的所有用户(通过电子邮件发送),以下是一些进一步的说明:

  • 所有电子邮件地址(subrecords.value where subrecords.title ='email')
  • 提交了多个相同表单的
  • (由records.name =“string-form-name”标识)。
  • subrecords.record = record.id只需加入表格(每个表单提交都是唯一的,并生成一个新的记录。因此无法识别用户和表单)。
  • records.form是一个外键= forms.id(它似乎没用,因为它需要查看另一个表使查询复杂化,使用records.name来识别表单似乎更简单)

到目前为止,感谢另一位用户,我有这个:

SELECT value     as email
      ,record
      ,COUNT(*)  as form_count
  FROM subrecords
 WHERE title = 'email'
   AND record IN (SELECT id
                    FROM records
                   WHERE name = 'form_name'
                 )
 GROUP BY value
         ,record
HAVING COUNT(*) > 1

它返回一个空值,但我无法缩小如何改进它以使其工作。 谢谢

1 个答案:

答案 0 :(得分:1)

我认为问题在于您按record进行分组。给定的记录只有一种形式。

但是,从in切换到join可以改善您的查询。另外,我不清楚你是否有一个特定的表单名称。如果是,请将and r.name = 'form_name'添加到on子句:

SELECT r.form, s.value as email, COUNT(distinct s.record)  as form_count
FROM subrecords s join
     records r
     on s.record = r.id
WHERE s.title = 'email'
GROUP BY s.value, r.form
HAVING form_count > 1;