【问题标题】:Need to find a common element between mysql rows需要在mysql行之间找到一个共同的元素
【发布时间】:2015-07-14 09:31:42
【问题描述】:

首先让我说我是 mysql 的新手,并且已经在这个网站和其他网站上搜索过适合我的解决方案。我已经很接近了(我认为),但似乎找不到解决方案。

我正在使用 RSForms 软件开发一个 Joomla 网站。我需要搜索一个表,其中一行包含 FirstName,另一行包含 LastName,另一行包含电子邮件。最终,我正在寻找所有 3 通用的 SubmissionId。SubmissionId 是由某些表单软件生成的数字,它按此 id 对所有表单提交的元素进行分组。我需要搜索所有 3 个共有的 id。这 3 个元素中的每一个都可能包含搜索的重复项。例如,搜索名字“John”可能会产生多个结果。我想找到与“John”和姓氏“Doe”相匹配的 SubmissionId,并发送电子邮件至“johndoe@gmail.com”,这样我就可以使用它来查找其他信息。 “John”、“Doe”和 johndoe@gmail.com”也可能有多个匹配项。

我已经尝试了以下的许多变体(有/没有 ANY)并将结果放入一个数组并计算每个元素。我只成功获得了“约翰”的第一个实例。

$getresults = $db->setQuery("SELECT SubmissionId FROM my_table_values WHERE FormId = '$formid' AND FieldValue = '$fname' AND SubmissionId = ANY
    (SELECT SubmissionId FROM my_table_values WHERE FormId = '$formid' AND FieldValue = '$lname' AND SubmissionId = ANY
    (SELECT SubmissionId FROM my_table_values WHERE FormId = '$formid' AND FieldValue = '$email' ))");

---SubmissionValueId---|---FormId---|---SubmissionId---|---FieldName---|---Field‌​‌​‌​Value---
---------18192---------|-----20-----|-------5462-------|-----Email-----|---johndoe@gmail.com---
---------18193---------|-----20-----|-------5462-------|-----FName-----|---John---
---------18194---------|-----20-----|-------5462-------|-----LName-----|---Doe---

【问题讨论】:

  • 能否请您展示您的表格my_table_values 结构?和数据样本(如果可能)

标签: mysql forms joomla


【解决方案1】:

一种可能性是使用将my_table_values自身连接两次的查询,以创建随后可以检查的内容。例如... (公平警告:临时编码) ...

select A.submission_id from my_table_values A inner join my_table_values B using (SubmissionID) inner join my_table_values C using (SubmissionID) where (A.formID="email" and A.fieldValue= "foo@bar.com") and (B.formID="lastname" and B.fieldValue= "bar") and (C.formID="first name" and C.fieldValue="bletch")

您需要examine 该查询以查看 (a) 是否 SQL 处理器接受它,以及 (b) 它是什么类型的执行计划跟上。最好对所有字段进行索引。您需要看到它计划每次使用索引来缩小可能性列表,并且它计划首先使用最具选择性的字段(例如“电子邮件”)。

using (fieldname) 语法特定于 MySQL。您可能需要使用 on 来做同样的事情。)

【讨论】:

    【解决方案2】:
    $getresults = $db->setQuery("
         SELECT 
           MAX(IF(FieldValue = '$fname',SubmissionId, NULL) as fnameId,
           MAX(IF(FieldValue = '$lname',SubmissionId, NULL) as lnameId,
           MAX(IF(FieldValue = '$email',SubmissionId, NULL) as emailId
         FROM my_table_values 
         WHERE FormId = '$formid' 
         GROUP BY FormId");
    

    【讨论】:

    • 我收到语法错误... 错误:1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'as fnameId, MAX(IF(FieldValue = 'xxxxx', SubmissionId, NULL) as lnameId' 附近使用正确的语法我认为应该已经关闭IF 语句后的括号,但这并没有改变错误。
    • 缺少一些右括号。就是这样。
    • @Alex 经过进一步测试,我确实看到这返回了一个 SubmissionId,但它只返回其中 1 个。我没有在我的原始帖子(现在已编辑)中提到可能存在多个与名称/电子邮件搜索匹配的 SubmissionId。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2015-12-12
    • 2021-08-19
    相关资源
    最近更新 更多