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@FJones99g
是流派的别名。单字母别名在SQL中非常常见,因为它们使SQL更具可读性。array\u agg[g.genre\u id]
是否聚合了所有结果?。如果你能解释一下其中的乐趣和论点,那将是非常棒的“电影流派g”是什么单字母变量名可以实现这一点unreadable@FJones99g
是流派的别名。单字母别名在SQL中非常常见,因为它们使SQL更具可读性。