在m2m场景中查找MYSQL中的不匹配记录

时间:2011-07-01 07:45:34

标签: mysql

我在mysql数据库中有一个m2m关系的表,如下所示:

tbltest (test_id, testdescription)
tblprofile (profile_id, profiledescription)
tbltestprofile(testprofile_id,test_id,profile_id)

我需要在测试表中显示test_id和description,其中我在tbltestprofile中没有匹配的记录,而profile_id = x

我尝试了使用NOT IN的各种组合,但没有达到预期的效果。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

SELECT test_id
     , testdescription
FROM tbltest AS t
WHERE NOT EXISTS
      ( SELECT *
        FROM tbltestprofile tp 
        WHERE t.test_id = tp.test_id
          AND tp.profile_id = X
      )


旁注。如果您保持表(和字段)名称简单并且不添加tbl前缀(例如testprofiletestprofile,则会有所帮助。您可能使用的简单3表连接:

SELECT tbltest.test_id
     , tbltest.testdescription
     , tblprofile.profile_id
     , tblprofile.profiledescription
FROM tbltest
  JOIN tbltestprofile
    ON tbltest.test_id = tbltestprofile.test_id
  JOIN tblprofile
    ON tblprofile.profile_id = tbltestprofile.profile_id
ORDER BY tblprofile.profiledescription

让我感到头晕目眩。这不是更好吗?即使没有别名:

SELECT test.id              AS test_id
     , test.description     AS test
     , profile.id           AS profile_id
     , profile.description  AS profile
FROM test
  JOIN testprofile
    ON test.id = testprofile.test_id
  JOIN profile
    ON profile.id = testprofile.profile_id
ORDER BY profile.description

答案 1 :(得分:0)

SELECT test_id, testdescription
FROM tbltest
LEFT JOIN tbltestprofile ON tbltest.test_id = tbltestprofile.test_id
WHERE tbltestprofile.test_id IS NULL;