Python 按列分组以获取Postgresql中的数组结果

Python 按列分组以获取Postgresql中的数组结果,python,sql,postgresql,Python,Sql,Postgresql,我有一个名为moviegenre的表,它看起来像: moviegenre: - movie (FK movie.id) - genre (FK genre.id) 我有一个查询(ORM生成),返回所有movie.imdb和genre.id,它们与给定的movie.imdb\u id有共同的genre.id SELECT "movie"."imdb_id", "moviegenre"."genre_id" FROM "moviegenre" INNER JO

我有一个名为
moviegenre
的表,它看起来像:

moviegenre:
- movie (FK movie.id)
- genre (FK genre.id)
我有一个查询(ORM生成),返回所有
movie.imdb
genre.id
,它们与给定的
movie.imdb\u id
有共同的
genre.id

SELECT "movie"."imdb_id", 
       "moviegenre"."genre_id" 
FROM   "moviegenre" 
       INNER JOIN "movie" 
               ON ( "moviegenre"."movie_id" = "movie"."id" ) 
WHERE  ( "movie"."imdb_id" IN (SELECT U0."imdb_id" 
                               FROM   "movie" U0 
                                      INNER JOIN "moviegenre" U1 
                                              ON ( U0."id" = U1."movie_id" ) 
                               WHERE  ( U0."last_ingested_on" IS NOT NULL 
                                        AND NOT ( U0."imdb_id" IN 
                                                  ( 'tt0169547' ) ) 
                                        AND NOT ( U0."imdb_id" IN 
                                                  ( 'tt0169547' ) ) 
                                        AND U1."genre_id" IN ( 2, 10 ) )) 
         AND "moviegenre"."genre_id" IN ( 2, 10 ) ) 
问题是,我将以以下格式获得结果:

[
  ('imdbid22`, 'genreid1'),
  ('imdbid22`, 'genreid2'),
  ('imdbid44`, 'genreid1'),
  ('imdbid55`, 'genreid8'),
]
在查询本身中是否有一种方法可以将所有类型id分组到
movie.imdb_id
下的列表中?我想在查询中进行分组。
目前在我的web应用程序代码(Python)中执行此操作,当返回50k+行时,速度非常慢

[
  ('imdbid22`, ['genreid1', 'genreid2']),
  ('imdbid44`, 'genreid1'),
  ('imdbid55`, 'genreid8'),
]
提前谢谢

编辑:

下面是针对当前结果运行的python代码

结果列表=[]

for item in movies_and_genres:
    genres_in_common = len(set([
        i['genre__id'] for i in movies_and_genres
        if i['movie__imdb_id'] == item['movie__imdb_id']
    ]))
    imdb_id = item['movie__imdb_id']

    if genres_in_common >= min_in_comon:
        result_item = {
            'movie.imdb_id': imdb_id,
            'count': genres_in_common
        }
        if result_item not in results_list:
            results_list.append(result_item)

return results_list

我希望python代码足够快:

movielist = [
  ('imdbid22', 'genreid1'),
  ('imdbid22', 'genreid2'),
  ('imdbid44, 'genreid1'),
  ('imdbid55', 'genreid8'),
]
dict = {}
for items in movielist:
    if dict[items[0]] not in dict:
        dict[items[0]] = items[1]
    else:
        dict[items[0]] = dict[items[0]].append(items[1])        
print dict
输出:

{'imdbid44': ['genreid1'], 'imdbid55': ['genreid8'], 'imdbid22': ['genreid1', 'genreid2']}
如果您只需要电影名称,请计算: 在原始查询中更改此选项,您将得到不需要python代码的答案

选择“电影”、“imdb\u id”、计数(“电影流派”、“流派id”)


按“电影”分组。“imdb\u id”
我希望python代码足够快:

movielist = [
  ('imdbid22', 'genreid1'),
  ('imdbid22', 'genreid2'),
  ('imdbid44, 'genreid1'),
  ('imdbid55', 'genreid8'),
]
dict = {}
for items in movielist:
    if dict[items[0]] not in dict:
        dict[items[0]] = items[1]
    else:
        dict[items[0]] = dict[items[0]].append(items[1])        
print dict
输出:

{'imdbid44': ['genreid1'], 'imdbid55': ['genreid8'], 'imdbid22': ['genreid1', 'genreid2']}
如果您只需要电影名称,请计算: 在原始查询中更改此选项,您将得到不需要python代码的答案

选择“电影”、“imdb\u id”、计数(“电影流派”、“流派id”)

按“movie”分组“.imdb\u id”

array\u agg
将创建一个包含某个
imdb\u id的所有
genre\u id
的数组:

array\u agg
将创建一个包含某个
imdb\u id的所有
genre\u id
的数组:



如果您的代码在50k行上运行缓慢,则表示您做错了。在不知道你的ORM给出解决方案的情况下,代码是一个尽可能快的代码,只是它必须在每次迭代中循环50k行,然后是50k行,才能进行分组。你当前的输出速度慢是什么?您现在是否使用python代码实现了预期的输出?python是瓶颈,需要80,000ms@RaduGheorghiu当然,为什么不呢?如果您的代码在50k行上运行缓慢,则表示您做错了。在不知道你的ORM给出解决方案的情况下,代码是一个尽可能快的代码,只是它必须在每次迭代中循环50k行,然后是50k行,才能进行分组。你当前的输出速度慢是什么?您现在是否使用python代码实现了预期的输出?python是瓶颈,需要80,000ms@RaduGheorghiu当然,为什么不呢?一个问题是函数必须在第一篇文章显示时返回dict列表
[{'movie.imdb_id':'someimdbid','count':5},{'movie.imdb_id':'someimdbid2','count':3}}
你的意思是它必须是list而不是dictional?是的,带有键'movie.imdb_id','count'的dicts列表一个问题是函数必须返回dicts列表,因为第一篇文章显示了
[{'movie.imdb_id':'someimdbid','count':5},{'movie imdb_id':'someimdbid2','count 3}}
你的意思是它必须是列表而不是口述的?是的,带有键“movie.imdb_id”,“count”的口述列表是否
数组_agg[g.genre_id]
聚合了所有的结果?。如果你能解释一下其中的乐趣和论点,那将是非常棒的“moviegenre g”是什么单字母变量名可以实现这一点unreadable@FJones99
g
是流派的别名。单字母别名在SQL中非常常见,因为它们使SQL更具可读性。
array\u agg[g.genre\u id]
是否聚合了所有结果?。如果你能解释一下其中的乐趣和论点,那将是非常棒的“电影流派g”是什么单字母变量名可以实现这一点unreadable@FJones99
g
是流派的别名。单字母别名在SQL中非常常见,因为它们使SQL更具可读性。