SQL查询,多个外键的主键

时间:2017-04-01 09:26:25

标签: mysql foreign-keys

我遇到了无法修复的问题。 我一直在查看其他一些帖子,但其中大多数都是复杂的让我理解/使用或不处理同样的问题。

首先是表格:

   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"

我想要的: 我需要所有Person ids,其中Person没有目标" 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&#39;而且对于BBB&#39;然后我会得到AAA&#39;&#39; BBB&#39;甚至有两个人。 现在的位置如何:

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

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可能正在寻找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"
 )

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

同样改变这个:

 AND Goal.goals != 'AAA'

select *
from (select distinct empl_name, cal_date from first_tbl, second_tbl
      where cal_date between [start date] and [end date]) as nested
left join second_tbl
    on  nested.empl_name = table_2.empl_name
    and nested.cal_date = table_2.work_date

答案 4 :(得分:0)

您的子选择过滤掉与#34; AAA&#34;不匹配的所有行。这包括&#34; DDD&#34;。你可以使用

mTasksRepository