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"

不过,这种观点可能会产生误导,因为它列出了演员和导演合作的次数,但它却出现在他们合作过的每一部电影的旁边。