Как я могу отфильтровать информацию, исключая некоторые значения в SQL? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть следующие таблицы:

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)
);

Представьте, что данные, вставленные в эти таблицы:

Таблица Person

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

Table Journey (и таблица 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 путешествовал по Portugal, Germany и France. Человек с id_person = 2 путешествовал к UK два раза и к Germany. Наконец, человек с id_person = 3 отправился на UK, Germany и Portugal.

Я должен выполнить SELECT там, где я хочу показать id_person и его соответствующие name ТОЛЬКО от людей, которые путешествовали на UK И Germany.

Итак, я хочу получить вывод:

    id_person      name
------------------------------
       2           Kevin

Я пытался выполнить это без успех:

select P.* from Person as P, Journey as J, Person_Journey as PJ
where P.id_person = PJ.id_person and J.id_journey = PJ.id_journey
and J.country in ("UK", "Germany")
group by (P.id_person)
having count(J.country) = 2;

Как я могу это сделать? Я использую MySQL

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Я бы использовал EXISTS:

Псевдокод : выберите имена людей, чьи идентификаторы появляются в строке «Германия» и в строке «Великобритания» таблицы «Путешествие».

Что бы перевести на:

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
)
0 голосов
/ 22 февраля 2020

Попробуйте:

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
    )
)

Хотя, скажем, в университете, объединения еще лучше чем это))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...