2

各 entryForm 行の名前を確認し、この名前が .siteid と entryForm.siteid が一致する SiteContacts のリストに含まれているかどうかを確認する必要があります。(サイトが一致しない entryForm 行をチェックしても意味がありません。) entryForms が一致しないままにしておく必要があります。

entryForm には 1 つの 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 に答える