如何过滤不包括SQL中某些值的信息?

时间:2020-02-22 18:21:53

标签: mysql sql select subquery

我有下表:

create table Person (

    id_person int,
    name varchar(255),
    primary key (id_person)
);

create table Journey (

    id_journey int,
    year int,
    country varchar(255),
    primary key (id_journey),
);

create table Person_Journey (

    id_journey int references Journey (id_journey),
    id_person int references Person (id_person),
    primary key (id_journey, id_travel)
);

想象一下插入到该表中的数据是:

餐桌人物

   id_person                name
-----------------------------------------------
      1                     Jake
      2                     Kevin 
      3                     Denis

餐桌之旅(和餐桌Person_Journey):

   id_person         id_travel          country
---------------------------------------------------
      1                 1               France
      1                 2               Germany
      1                 3               Portugal
      2                 4               UK
      2                 5               Germany
      2                 6               UK
      3                 7               UK
      3                 8               Portugal
      3                 9               Germany

如前面的示例所示,拥有id_person = 1的人已经去过PortugalGermanyFrance。拥有id_person = 2的人已经去过UK两次并且去过Germany。最后,拥有id_person = 3的人已经去过UKGermanyPortugal

我必须在要显示SELECT的位置执行id_person,并且只有name和{{ 1}}。

所以我想得到的输出是:

UK

我尝试执行此操作未成功:

Germany

我该怎么做?我正在使用MySQL

2 个答案:

答案 0 :(得分:0)

尝试一下:

SELECT Person.* FROM Person_Journey
INNER JOIN (
    SELECT id_journey FROM Journey
    WHERE 
    country in('Germany', 'UK')
    GROUP BY id_journey
    HAVING COUNT(DISTINCT country) = 2
) t
ON Person_Journey.id_journey = t.id_journey
INNER JOIN Person ON Person.id_person = Person_Journey.id_person

好吧,一种没有联接的解决方案可能是使用IN

SELECT * FROM Person
    WHERE id_person IN (
    SELECT id_person FROM Person_Journey
    WHERE id_journey IN(
        SELECT id_journey FROM Journey
        WHERE 
        country in('Germany', 'UK')
        GROUP BY id_journey
        HAVING COUNT(DISTINCT country) = 2
    )
)

尽管在大学里说,加入仍然比这更好))

答案 1 :(得分:0)

我会使用EXISTS

伪代码: 选择人员名称,其ID会显示在旅程表的“德国”行和“英国”行中。

这将翻译为:

SELECT p.name FROM Person p
WHERE EXISTS (
    SELECT 1 FROM Journey j
    WHERE country='UK' 
    AND p.id_person = j.id_person
AND EXISTS (
    SELECT 1 FROM Journey j
    WHERE country='Germany' 
    AND p.id_person = j.id_person
)