2

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

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

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

但它不是......

4

2 回答 2

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 ║
╚════╩═══════╩════════╝
于 2013-03-12T16:37:11.580 回答
0

我认为这也是像上面 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

于 2013-03-14T10:55:12.603 回答