SQL 无法按...选项分组?
SQL can't group by... Options?
我有下一张表:
involved_in 代表一部电影和其中的工作人员之间的关系:
FID AID JOB
---------- ---------- -----------------------------------
2387816 226673 actor
2146284 230306 actor
1814529 233362 actor
2146710 275818 actor
2033140 324419 actor
2387816 452297 actor
1749641 522815 actor
2379685 972581 actor
2384487 1001930 actor
2065098 1021573 actor
is_a表示两部电影之间的关系,因为电影a是电影b的前传:
MOVID1 MOVID2 REL_ID
---------- ---------- ----------
2455766 1858631 2
2465356 716238 12
2465467 1005316 2
2465585 2046499 1
2465793 1992318 6
2465793 2144984 5
2467514 1984530 15
在其他表格中,我可以获得上面使用的 id 的标题和名称。
我想找到那些在不相关的电影中合作过 x 次以上的对 actor-director,例如约翰尼·德普 (Johnny Depp) 与蒂姆·伯顿 (Tim Burton) 在不相关的电影中合作过。
问题出在 x 次和我非常小的数据库帐户上,这不会让我有足够大的临时表。
我可以:
create view friends as
(select actor, director, film, count(*) over (PARTITION BY actor, director) as together
from
(select a.aid as actor, b.aid as director, a.fid as film
from involved_in a, involved_in b
where a.fid=b.fid AND (a.job='actor' or a.job='actress') AND b.job='director'));
这将给我每 actor-director 对,他们合作过的每一部电影以及他们合作过的次数。
视图太大,所以我可以先删除所有一起工作少于 x 次的对。使用按演员分组,导演让我在电影中出错(不是按表情分组)。
有什么方法可以限制出现计数小于 x 的行吗?我也试过
having count(...) > x
如果我能算出(actor, director)就完美了,但这当然不是语法,因为它会很方便。
让我的朋友查看后,我正在使用此查询:
select f1.actor, f1.director
from friends f1, friends f2, is_a
where f1.actor = f2.director and f2.actor = f1.director and NOT (f1.film = movid1 and f2.film = movid2);
我不使用 JOIN ON
之类的,因为我的老师说它们是多余的,但我确实认为它看起来更好,所以也许我最终会使用它们。
有什么想法吗?
您已经有嵌套的 select 语句,只需再添加一个:
create view friends as
(
SELECT actor, director, film, together
FROM (
select actor, director, film, count(*) over (PARTITION BY actor, director) as together
from
(
select a.aid as actor, b.aid as director, a.fid as film
from involved_in a
INNER JOIN involved_in b ON(a.fid=b.fid)
WHERE (a.job='actor' or a.job='actress')
AND b.job='director'
) InnerMostQuey
) MiddleQuery
WHERE together > x -- Replace x with whatever number that makes you happy :-)
);
我建议使用以下查询,对您的查询进行一些重大调整并删除冗余。
使用显式 JOINs
以获得更好的可读性,并使用 IN
子句在代码中保存一些 space。 Planner 无论如何都会翻译这个条款。
CREATE VIEW friends AS
SELECT
actor, director, film, num_together
FROM(
SELECT
a.aid AS actor,
b.aid AS director,
a.fid AS film,
COUNT(*) OVER (PARTITION BY a.aid, b.aid) AS num_together
FROM
involved_in a
INNER JOIN involved_in b ON
a.fid = b.fid
WHERE
a.job IN ('actor', 'actress')
AND b.job = 'director'
) foo
WHERE
num_together < 'x' -- placeholder for your "limit the rows that appear with count less than x"
不过,这种观点可能会产生误导,因为它列出了演员和导演合作的次数,但它却出现在他们合作过的每一部电影的旁边。
我有下一张表: involved_in 代表一部电影和其中的工作人员之间的关系:
FID AID JOB
---------- ---------- -----------------------------------
2387816 226673 actor
2146284 230306 actor
1814529 233362 actor
2146710 275818 actor
2033140 324419 actor
2387816 452297 actor
1749641 522815 actor
2379685 972581 actor
2384487 1001930 actor
2065098 1021573 actor
is_a表示两部电影之间的关系,因为电影a是电影b的前传:
MOVID1 MOVID2 REL_ID
---------- ---------- ----------
2455766 1858631 2
2465356 716238 12
2465467 1005316 2
2465585 2046499 1
2465793 1992318 6
2465793 2144984 5
2467514 1984530 15
在其他表格中,我可以获得上面使用的 id 的标题和名称。
我想找到那些在不相关的电影中合作过 x 次以上的对 actor-director,例如约翰尼·德普 (Johnny Depp) 与蒂姆·伯顿 (Tim Burton) 在不相关的电影中合作过。
问题出在 x 次和我非常小的数据库帐户上,这不会让我有足够大的临时表。 我可以:
create view friends as
(select actor, director, film, count(*) over (PARTITION BY actor, director) as together
from
(select a.aid as actor, b.aid as director, a.fid as film
from involved_in a, involved_in b
where a.fid=b.fid AND (a.job='actor' or a.job='actress') AND b.job='director'));
这将给我每 actor-director 对,他们合作过的每一部电影以及他们合作过的次数。
视图太大,所以我可以先删除所有一起工作少于 x 次的对。使用按演员分组,导演让我在电影中出错(不是按表情分组)。
有什么方法可以限制出现计数小于 x 的行吗?我也试过
having count(...) > x
如果我能算出(actor, director)就完美了,但这当然不是语法,因为它会很方便。
让我的朋友查看后,我正在使用此查询:
select f1.actor, f1.director
from friends f1, friends f2, is_a
where f1.actor = f2.director and f2.actor = f1.director and NOT (f1.film = movid1 and f2.film = movid2);
我不使用 JOIN ON
之类的,因为我的老师说它们是多余的,但我确实认为它看起来更好,所以也许我最终会使用它们。
有什么想法吗?
您已经有嵌套的 select 语句,只需再添加一个:
create view friends as
(
SELECT actor, director, film, together
FROM (
select actor, director, film, count(*) over (PARTITION BY actor, director) as together
from
(
select a.aid as actor, b.aid as director, a.fid as film
from involved_in a
INNER JOIN involved_in b ON(a.fid=b.fid)
WHERE (a.job='actor' or a.job='actress')
AND b.job='director'
) InnerMostQuey
) MiddleQuery
WHERE together > x -- Replace x with whatever number that makes you happy :-)
);
我建议使用以下查询,对您的查询进行一些重大调整并删除冗余。
使用显式 JOINs
以获得更好的可读性,并使用 IN
子句在代码中保存一些 space。 Planner 无论如何都会翻译这个条款。
CREATE VIEW friends AS
SELECT
actor, director, film, num_together
FROM(
SELECT
a.aid AS actor,
b.aid AS director,
a.fid AS film,
COUNT(*) OVER (PARTITION BY a.aid, b.aid) AS num_together
FROM
involved_in a
INNER JOIN involved_in b ON
a.fid = b.fid
WHERE
a.job IN ('actor', 'actress')
AND b.job = 'director'
) foo
WHERE
num_together < 'x' -- placeholder for your "limit the rows that appear with count less than x"
不过,这种观点可能会产生误导,因为它列出了演员和导演合作的次数,但它却出现在他们合作过的每一部电影的旁边。