2017-04-01 223 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