【问题标题】:How to do a foreach type query in mysql, comparing each row with several rows in another table?如何在mysql中进行foreach类型查询,将每一行与另一个表中的几行进行比较?
【发布时间】:2013-03-12 16:34:57
【问题描述】:

我需要检查每个 entryForm 行的名称,并检查该名称是否出现在 .siteid 和 entryForm.siteid 匹配的 SiteContacts 列表中。 (没有必要检查站点不匹配的 entryForm 行。)我需要留下不匹配的 entryForms。

一个entryForm有一个siteContact,一个siteContact可以有多个entryForms。

select * from siteContacts, entryForm 
where siteContacts.siteid=entryForm.siteid 
and entryForm.name not like concat('%',siteContacts.lastname, '%')

siteContacts 是这样的表:

id  |   lastname     |  siteid  
===============================
7   |   Cooper       |   2
8   |   Hofstadter   |   2
9   |   Wolowitz     |   3
10  |   Koothrappali |   3

entryForms 是这样的表格:

id  |   name           |  siteid  
==================================
1   |   Sheldon Cooper |   2
2   |   L. Hofstadter  |   2
3   |   Penny          |   3
4   |   Wolowitz       |   3
5   |   Dr Hofstadter  |   2

结果应该是 Penny :

3   |   Penny          |   3

但事实并非如此......

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:

    您应该使用LEFT JOIN 而不是INNER JOIN,因为您在这里处理的是在其他表上没有匹配的记录。

    SELECT  a.*
    FROM    entryForms a
            LEFT JOIN siteContact b
                ON a.Name LIKE CONCAT('%',b.LastName,'%')
    WHERE   b.LastName IS NULL
    

    如需进一步了解联接,请访问以下链接:

    输出

    ╔════╦═══════╦════════╗
    ║ ID ║ NAME  ║ SITEID ║
    ╠════╬═══════╬════════╣
    ║  3 ║ Penny ║      3 ║
    ╚════╩═══════╩════════╝
    

    【讨论】:

    • 您是如何“键入”该表的?那些竖线是哪个字符?
    • 只需重写实际数据库的查询并通过它来手动检查随机样本,因为大约有 1500 个结果。
    • 亲爱的 JW,您如何限制他们来自同一站点的位置?如果表单和站点不匹配,则基本上没有必要比较这两个名称。 IE 检查仅包含站点 A 联系人的站点 A 表单?
    • 如果您为此打开另一个问题可能会很好,这样很多其他人都可以帮助您:)无论如何您的意思是什么限制他们来自同一站点的位置?
    • 还不知道如何表达这些问题,我也想知道你的答案是否已经做到了:例如,应该将站点 ID 3 的 entryForm 与站点 ID 3 的站点联系人进行比较,并且应该在 entryForm 的位置返回 entryForm。 name 不是 siteContacts.lastName 中的某个人,对于站点 3。
    【解决方案2】:

    我认为这也是像上面 JW 一样的连接,但写成另一种方式:

    select * from entryForms
    where entryForms.name not in (
      select entryForms.name from siteContacts, entryForms 
      where siteContacts.siteid=entryForms.siteid 
      and entryForms.name like concat('%',siteContacts.lastname, '%')
    )
    

    http://www.sqlfiddle.com/#!2/51ae9/16

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多