gpt4 book ai didi

mysql - 坚持使用 MySQL 查询

转载 作者:可可西里 更新时间:2023-11-01 07:09:10 27 4
gpt4 key购买 nike

我有一个表架构为

create table Location(
id int primary key,
city varchar(255),
state varchar(100),
country varchar(255)
);
create table Person(
id int primary key,
name varchar(100)
);
create table Photographer(
id int primary key references Person(id) on update cascade on delete cascade,
livesIn int not null references Location(id) on update cascade on delete no action
);
create table Specialty(
photographer int references Photographer(id) on update cascade on delete cascade,
type enum('portrait','landscape','sport'),
primary key(photographer, type)
);
create table Photo(
id int primary key,
takenAt timestamp not null,
takenBy int references Photographer(id) on update cascade on delete no action,
photographedAt int references Location(id) on update cascade on delete no action
);
create table Appearance(
shows int references Person(id) on update cascade on delete cascade,
isShownIn int references Photo(id) on update cascade on delete cascade,
primary key(shows, isShownIn)
);

我遇到了两个问题:

1) 仅显示居住在同一地点的摄影师的照片。每张照片列出一次。也就是说,照片必须有摄影师,他们都需要住在同一个地方。

2) 地点的每张照片都由马萨诸塞州任何照片中未出现的摄影师拍摄?对于每个位置仅显示城市,并且每个位置仅显示一次。

我的尝试:1)

SELECT ph.id, ph.takenAt, ph.takenBy, ph.photographedAt FROM 
(SELECT * FROM Photo p, Appearance ap WHERE p.id = ap.isShownIn
HAVING ap.shows IN (SELECT person.id FROM Person,Photographer WHERE person.id
photographer.id)) ph
WHERE ph.photographedAt = (SELECT location.id FROM location WHERE location.id =
(SELECT livesIn FROM Photographer WHERE id = ph.takenBy))

2)

select distinct city from location where location.id in (
select photographedAt from photo, (select * from appearance where appearance.shows in
(select photographer.id from photographer)) ph
where photo.id = ph.isShownIn )
and location.state <> 'Massachusetts'

任何人都可以帮助创建这些查询吗??

最佳答案

您的查询是“列出具有属性 X 和 Y 的单个项目,其中 X 和 Y 在不同的表中” 的两种查询。

这些类型的问题通常使用带有 EXISTSNOT EXISTS 的相关子查询来解决。

使用 EXISTS 处理“每个项目只显示一次” 部分。否则,您需要将分组与复杂的联接结合使用,这很快就会变得困惑。

问题 1 要求:

[...] photos must have persons that are photographers, and they all need to live in the same place.

请注意,此定义并没有说“如果照片中也包含其他人,则不要显示照片”。如果这就是您的真正意思,那么您可以从下面的 SQL 中得出结论并在下次编写更好的定义。 ;)

SELECT
*
FROM
Photo p
WHERE
EXISTS (
-- ...that has at least one appearance of a photographer
SELECT
1
FROM
Appearance a
INNER JOIN Photographer r ON r.id = a.shows
INNER JOIN Location l ON l.id = r.livesIn
WHERE
a.isShownIn = p.id
-- AND l.id = <optional location filter would go here>
AND NOT EXISTS (
-- ...that does not have an appearance of a photographer from
-- some place else
SELECT
1
FROM
Appearance a1
INNER JOIN Photographer r1 ON r1.id = a1.shows
INNER JOIN Location l1 ON l1.id = r1.livesIn
WHERE
a1.isShownIn = p.Id
AND l1.id <> l.id
)
)

第二题读

[...] locations that have the property that every photo in the location was taken by a photographer who is not shown in any photo in Massachusetts? For each location show only the city, and show each location only once.

相应的 SQL 看起来像:

SELECT
city
FROM
Location l
WHERE
NOT EXISTS (
-- ...a photo at this location taken by a photographer who makes
-- an apperance on another photo which which was taken in Massachusetts
SELECT
1
FROM
Photo p
INNER JOIN Photographer r ON r.id = p.takenBy
INNER JOIN Appearance a ON a.shows = r.id
INNER JOIN Photo p1 ON p1.id = a.isShownIn
WHERE
p.photographedAt = l.Id
AND p1.photographedAt = <the location id of Massachusetts>
)

关于mysql - 坚持使用 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com