【问题标题】:How can I filter the information excluding some of the values in SQL?如何过滤排除 SQL 中某些值的信息?
【发布时间】:2020-02-22 18:21:53
【问题描述】:

我有以下表格:

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

Table Journey(和 Table 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 的人曾两次前往UKGermany。最后,id_person = 3 的人去过UKGermanyPortugal

我必须在我想显示id_person 的地方执行SELECT,并且它是各自的name,仅来自去过UKGermany 的人。

所以我想要得到的输出是:

    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

【问题讨论】:

  • 你的大学是 1991 年的吗?
  • 显式 JOIN 是当前 25 年以上的 ANSI-1992 SQL 标准,它长期以来取代了隐式连接,就像您在 WHERE 中所做的那样。请联系讲师和/或计划以调整课程,因为不教授显式联接对 SQL 学生不利。

标签: mysql sql select subquery


【解决方案1】:

试试这个:

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's:

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

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

【讨论】:

  • 感谢您的回答。请问,如果不使用连接会怎样?我知道,这可能是一个奇怪的问题。
  • 大学还没学过joins,不能用
  • 欣赏它,并会在大学里说出来。谢谢!
【解决方案2】:

我会使用EXISTS:

伪代码: 在 Journey 表的“德国”行和“英国”行中选择 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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2023-04-07
    • 2015-12-10
    相关资源
    最近更新 更多