2017-04-01 174 views
0

我有一个问题,我无法解决。 我一直在寻找一些其他职位,但其中大部分要么复杂,为我理解/使用或不处理相同的问题。SQL查询,多个外键的主键

首先表:

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

目标

id | idPerson | goals 
    =========================== 
    1 | 1  | "AAA" 
    2 | 1  | "AAA" 
    4 | 1  | "DDD" 
    5 | 2  | "CCC" 
    6 | 2  | "BBB" 
    7 | 3  | "AAA" 

我想要什么: 我需要所有的人的ID,而该人没有目标 “AAA”。 目前,一个人只能在表格目标中拥有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" 
) 

如果可能的话可能有人解释我为什么我的SQL不工作,什么我必须做不同的,所以它的工作原理?有了一个解释,我可以在将来避免同样的问题。 :)

谢谢。

编辑: 我没有想到这会产生问题,但是当我不仅过滤'AAA',而且'BBB',那么我会得到'AAA','BBB'的结果,甚至一些既。 如何哪里是现在:

AND Person.id NOT IN 
(
    SELECT Goal.idPerson 
    FROM Goal 
    WHERE Person.id = Goal.idPerson 
    AND Goal.goals = 'AAA' 
    AND Goal.goals = 'BBB' 
) 

回答

0

你可能寻找NOT EXISTS,而不是像

SELECT Person.id, Person.amt 
FROM Person 
WHERE amt < 10 
AND NOT EXISTS 
(
    SELECT 1 
    FROM Goal 
    WHERE idperson = person.id AND goals = "AAA" 
) 
+0

对不起,我应该说我使用phpmyadmin,当我尝试使用SQL,然后我得到不存在的消息“无法识别的关键字”。 – SergSam

+0

我确实更新了phpmyadmin,现在我可以使用NOT EXISTS,但是当我想要过滤不止一个目标时,我遇到了另一个问题,就像我在主帖中的编辑中所描述的那样。 – SergSam

+0

@SergSam,使用'IN'运算符,然后像'AND目标IN('AAA','BBB','CCC')' – Rahul

0

而且改变这种:

AND Goal.goals != "AAA" 

AND Goal.goals != 'AAA' 
0

你再选择过滤器不匹配的 “AAA” 的所有行。这包括“DDD”。您可以使用

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

你不需要它相关并要使用NOT IN代替:

select Person.id, 
    Person.amt 
from Person 
where amt < 10 
    and id not in (
     select idPerson 
     from Goal 
     where goals = 'AAA' 
     ) 
0

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

SELECT * 
FROM Person 
WHERE amt < 10 
AND Person.id NOT IN (
     SELECT idPerson FROM Goal WHERE goals = 'AAA' 
); 
+0

谢谢,如果我使用一个标准,但是当我尝试选择所有不是'AAA'而不是'BBB'时它将不再工作,这是有效的。 – SergSam