如果子查询为空,则出现MySQL问题

如果子查询为空,则出现MySQL问题,mysql,sql,null,subquery,left-join,Mysql,Sql,Null,Subquery,Left Join,我有5张桌子(我只谈请求中没有的): 员工(登录名,代理ID) 频率测试(id、客户邮件、员工登录) 任务测试(id、客户邮件、员工登录) 情景测试(id、客户邮件、员工登录) 客户(电子邮件、年龄、性别) 这是我的要求: SELECT Client.email, Client.age, Client.gender FROM Client, (SELECT FreqTest.clientEmail FROM FreqTest, (SELECT Employee.login

我有5张桌子(我只谈请求中没有的):

  • 员工(登录名,代理ID)
  • 频率测试(id、客户邮件、员工登录)
  • 任务测试(id、客户邮件、员工登录)
  • 情景测试(id、客户邮件、员工登录)
  • 客户(电子邮件、年龄、性别)
这是我的要求:

SELECT Client.email, Client.age, Client.gender
FROM Client,
  (SELECT FreqTest.clientEmail
  FROM FreqTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE FreqTest.employeeLogin = EmployeeByAgency.login) Freq,

  (SELECT QuestTest.clientEmail
  FROM QuestTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE QuestTest.employeeLogin = EmployeeByAgency.login) Quest,

  (SELECT SitTest.clientEmail
  FROM SitTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE SitTest.employeeLogin = EmployeeByAgency.login) Sit

WHERE Client.email = Freq.emailClient
OR    Client.email = Quest.emailClient
OR    Client.email = Sit.emailClient
GROUP BY Client.email;
我想要代理机构进行测试的客户的电子邮件。 它几乎在任何情况下都有效,除非没有客户在同一机构进行了3次测试

我不得不试着用英语翻译,如果我的英语不完美,我很抱歉

因此,我要明确(与同一机构):

  • 如果客户A频率测试和任务测试,客户B3,客户C没有的,我会收到AB的电子邮件
  • 如果客户A进行了3次测试,客户B也进行了3次测试,客户C没有进行测试,我仍然会收到AB的电子邮件
  • 如果没有客户进行了3次不同的测试,无论我得到什么都没有
我想可能是因为如果任何子查询(Freq、Quest或Sit)都没有返回结果,那么它将是空的


如果我不清楚或者翻译这些内容时出错,我想再次道歉。

使用左连接避免空引用

SELECT Client.email, Client.age, Client.gender
FROM Client
LEFT JOIN  (SELECT FreqTest.clientEmail
  FROM FreqTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE FreqTest.employeeLogin = EmployeeByAgency.login) Freq
ON Client.email = Freq.emailClient

LEFT JOIN  (SELECT QuestTest.clientEmail
  FROM QuestTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE QuestTest.employeeLogin = EmployeeByAgency.login) Quest
ON Client.email = Quest.emailClient

LEFT JOIN  (SELECT SitTest.clientEmail
  FROM SitTest,
    (SELECT Employee.login
    FROM Employee
    WHERE Employee.agencyID = 'anID') EmployeeByAgency
  WHERE SitTest.employeeLogin = EmployeeByAgency.login) Sit
ON  Client.email = Sit.emailClient
WHERE Freq.emailClient is NOT NULL
OR    Quest.emailClient IS NOT NULL
OR    Sit.emailClient IS NOT NULL
GROUP BY Client.email;

工作如期进行,谢谢。我为笨拙地处理空值感到难过。