我有下表:
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
的人已经去过Portugal
,Germany
和France
。拥有id_person = 2
的人已经去过UK
两次并且去过Germany
。最后,拥有id_person = 3
的人已经去过UK
,Germany
和Portugal
。
我必须在要显示SELECT
的位置执行id_person
,并且只有name
和{{ 1}}。
所以我想得到的输出是:
UK
我尝试执行此操作未成功:
Germany
我该怎么做?我正在使用MySQL
答案 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
)