Mysql SQL查询,主键到多个外键

Mysql SQL查询,主键到多个外键,mysql,foreign-keys,Mysql,Foreign Keys,我遇到了一个无法解决的问题。 我一直在看一些其他的帖子,但大多数帖子要么太复杂,让我无法理解/使用,要么没有处理相同的问题 首先是表格: 人 id | amt ============= 1 | 5 2 | 26 3 | 3 目标 我想要的是: 我需要所有没有目标AAA的人员ID。 目前,一个人在目标表中只能有1到3个目标 我的选择: SELECT Person.id, Person.amt FROM Person

我遇到了一个无法解决的问题。 我一直在看一些其他的帖子,但大多数帖子要么太复杂,让我无法理解/使用,要么没有处理相同的问题

首先是表格:

   id   |   amt
   =============
    1   |    5
    2   |    26
    3   |    3
目标

我想要的是: 我需要所有没有目标AAA的人员ID。 目前,一个人在目标表中只能有1到3个目标

我的选择:

 SELECT Person.id, Person.amt
 FROM Person 
 WHERE amt < 10 
 AND Person.id IN 
 (
    SELECT Goal.idPerson 
    FROM Goal 
    WHERE Person.id = Goal.idPerson 
    AND Goal.goals != "AAA"
 )
还要改变这一点:

 AND Goal.goals != "AAA"

还要改变这一点:

 AND Goal.goals != "AAA"


您的子选择将筛选所有与AAA不匹配的行。这包括DDD。你可以用

SELECT * FROM Person p
WHERE NOT EXISTS (SELECT g.id FROM Goal g WHERE g.goals="AAA" AND g.idPerson=p.id)

您的子选择将筛选所有与AAA不匹配的行。这包括DDD。你可以用

SELECT * FROM Person p
WHERE NOT EXISTS (SELECT g.id FROM Goal g WHERE g.goals="AAA" AND g.idPerson=p.id)

您不需要将其关联起来,而是希望使用NOT IN:


您不需要将其关联起来,而是希望使用NOT IN:

你可能在寻找一个不存在的东西

 SELECT Person.id, Person.amt
 FROM Person 
 WHERE amt < 10 
 AND NOT EXISTS  
 (
    SELECT 1
    FROM Goal 
    WHERE idperson = person.id AND goals = "AAA"
 )
你可能在寻找一个不存在的东西

 SELECT Person.id, Person.amt
 FROM Person 
 WHERE amt < 10 
 AND NOT EXISTS  
 (
    SELECT 1
    FROM Goal 
    WHERE idperson = person.id AND goals = "AAA"
 )
您需要使用NOT IN而不是IN,例如:

您需要使用NOT IN而不是IN,例如:


很抱歉,我应该说我使用的是phpmyadmin,当我尝试使用SQL时,我获取的消息不存在无法识别的关键字。我确实更新了phpmyadmin,现在我也可以使用NOT EXISTS,但当我想筛选多个目标时,遇到了另一个问题,就像我在主帖子的编辑中所述。@SergSam,使用IN运算符,然后在'AAA'、'BBB'、'CCC'中选择目标,现在使用IN运算符,谢谢@Rahul!很抱歉,我应该说我使用的是phpmyadmin,当我尝试使用SQL时,我获取的消息不存在无法识别的关键字。我确实更新了phpmyadmin,现在我也可以使用NOT EXISTS,但当我想筛选多个目标时,遇到了另一个问题,就像我在主帖子的编辑中所述。@SergSam,使用IN运算符,然后在'AAA'、'BBB'、'CCC'中选择目标,现在使用IN运算符,谢谢@Rahul!谢谢,如果我使用一个标准,这是有效的,但是当我尝试选择所有不“AAA”和不“BBB”的地方时,它将不再起作用。谢谢,如果我使用一个标准,这是有效的,但是当我尝试选择所有不“AAA”和不“BBB”的地方时,它将不再起作用。
 SELECT Person.id, Person.amt
 FROM Person 
 WHERE amt < 10 
 AND NOT EXISTS  
 (
    SELECT 1
    FROM Goal 
    WHERE idperson = person.id AND goals = "AAA"
 )
SELECT *
FROM Person
WHERE amt < 10 
 AND Person.id NOT IN (
        SELECT idPerson FROM Goal WHERE goals = 'AAA'
  );