1

私はスキルと呼ばれる別のテーブルとの多対多関係としてのモデルユーザープロファイルを持っていますスキルと呼ばれる別のテーブルとの多対多関係としてのモデルグループも持っています

ユーザープロファイルが各グループに共通するスキルの数をカウントするクエリを作成したいと思います。

また、特定のユーザー プロファイルが他のユーザー プロファイルと共通に持っているスキルの数をカウントするクエリを作成したいと思います

誰かがこれを行うのを手伝ってくれませんか。ありがとうございました

モデル:

class UserProfile(models.Model):    
    slug = models.SlugField(max_length=200)
    user = models.ForeignKey(User, unique =True)
    skills = models.ManyToManyField(Skills,null=True, blank=True)
    courses = models.ManyToManyField(Course,null=True, blank=True)

class Group(models.Model):
    slug = models.SlugField(max_length=200)
    name = models.CharField(max_length=200)
    skills = models.ManyToManyField(Skills,null=True, blank=True)

class Skills(models.Model):
    slug = models.SlugField(max_length=200)
    name = models.CharField(max_length=200)

だから私はグループのためにそれを行う方法を見つけました

groupRecommendation = Group.objects.extra(
select={
    'skills_count': """
     SELECT COUNT(*) FROM axiom_alto_userprofile_skills
     JOIN axiom_alto_group_skills on axiom_alto_userprofile_skills.skills_id = axiom_alto_group_skills.skills_id
     WHERE axiom_alto_group_skills.group_id= axiom_alto_group.id AND axiom_alto_userprofile_skills.userprofile_id = %d """ % profile.id,

},

).order_by('-skills_count')

しかし、私はユーザー間でそれを行う方法がわかりません

4

2 に答える 2

1

最初のクエリは、特定のユーザー プロファイルについて、ユーザーが各グループと共有するスキルの数をカウントすることです。あなたの投稿では、サブクエリを使用してそれを行う方法を示しています。ただし、一部のデータベースでは、サブクエリは結合よりもパフォーマンスがはるかに低いため、サブクエリの代わりに結合を使用して同じ結果を得る方法に興味があるかもしれません。

SELECT G.id, G.slug, G.name, COUNT(GS.id) AS skills_count
FROM axiom_alto_group G
INNER JOIN axiom_alto_userprofile_skills US
  ON US.userprofile_id = %s
LEFT OUTER JOIN axiom_alto_group_skills GS
  ON GS.group_id = G.id AND US.skills_id = GS.skills_id
GROUP BY G.id, G.slug, G.name
ORDER BY skills_count DESC

Djangoでは、モデルに対して生の SQL クエリを使用して実行できます。Group

Group.objects.raw(''' ... SQL as above ... ''', [profile.id])

これで、2 番目のクエリを実行する方法が簡単にわかるはずです。つまり、特定のユーザー プロファイルについて、ユーザーが他のユーザーと共有するスキルの数をカウントするには、次のようにします。

SELECT U.id, U.slug, U.user, COUNT(US2.id) AS skills_count
FROM axiom_alto_userprofile U
INNER JOIN axiom_alto_userprofile_skills US1
  ON US1.userprofile_id = %s
LEFT OUTER JOIN axiom_alto_userprofile_skills US2
  ON US2.userprofile_id = U.id AND US2.skills_id = US1.id
GROUP BY U.id, U.slug, U.user
ORDER BY skills_count DESC

繰り返しますが、Django では生の SQL クエリを使用して、今回はUserProfileモデルに対して実行できます。

UserProfile.objects.raw(''' ... SQL as above ... ''', [profile.id])
于 2013-04-06T09:10:46.480 に答える
0
groupRecommendation = Group.objects.extra(
    select={
    'skills_count': """
     SELECT COUNT(*) FROM axiom_alto_userprofile_skills
     JOIN axiom_alto_group_skills on axiom_alto_userprofile_skills.skills_id = axiom_alto_group_skills.skills_id
     WHERE axiom_alto_group_skills.group_id= axiom_alto_group.id AND axiom_alto_userprofile_skills.userprofile_id = %d """ % profile.id,
    },
).order_by('-skills_count')
于 2013-04-06T18:36:00.283 に答える