2017-05-05 22 views
1

私は3つのテーブル:Student(id, username),Skill(id, value)およびStudentSkill(id, student_id, skill_id)を持っています。彼らはそのようloook Djangoのモデル(ショートバージョン)では
いくつかの同じパラメータを持つ行を選択

class Student(models.Model): 
    username = models.CharField(max_length = 50, unique = True) 

class Skill(models.Model): 
    value = models.CharField(max_length = 50, unique = True) 

class StudentSkill(models.Model): 
    student = models.ForeignKey(Student, on_delete=models.CASCADE) 
    skill = models.ForeignKey(Skill, on_delete=models.CASCADE) 

私は特定のスキルを持つ学生のクエリセットを返す要求を記述する必要があります。

例えば、私は、データベース内の次のデータを有する:

Student 
id  | username 
------ | ------ 
1  | user1 
2  | user2 
3  | user3 

Skill 
id  | value 
------ | ------ 
1  | s1 
2  | s2 
3  | s3 

StudentSkill 
id  | student_id | skill_id 
------ | ---------- | -------- 
1  | 1   | 1 
2  | 2   | 1 
3  | 2   | 2 
4  | 3   | 1 
5  | 3   | 2 
6  | 3   | 3 

user1

1つのスキルを有している:( s1s2
user3 3つのスキルを有する:( user2s1
2つのスキルを有します s1, s2および s3

私はスタテンs2もし
>user1user2user3 - - 私は>user3

- >user2user3
s1s3場合s1場合s1s2を持っているTS、私はuser2user3
を取る必要がありますこの問題を解決する2つの方法を知っているが、どちらも悪いと思う。

まず:

students = Student.objects.raw(''' 
    SELECT t1.* FROM (
     SELECT student.* FROM student 
      INNER JOIN studentskill ON studentskill.student_id = student.user_id 
      INNER JOIN skill ON skill.id = studentskill.skill_id 
      WHERE skill.id = 1 
     ) AS t1 
     INNER JOIN studentskill ON studentskill.student_id = t1.user_id 
     INNER JOIN skill ON skill.id = studentskill.skill_id 
     WHERE skill.id = 2 
    ''') 

セカンド(私はこのコードをチェックしていない、それはバグを持っている場合があります):

students = Student.objects.filter(studentskill__skill__id = 1 
    ).select_related('studentskill', 'skill' 
    ).only('student', 'studentskill', 'skill__id') 
students.filter(studentskill__skill__id = 2) 

答えて

0

あなたがして、グループを使用して= 2

明確なスキルを持つことができ
select SELECT student.id, student.username 
    FROM student 
    INNER JOIN studentskill ON studentskill.student_id = student.user_id 
    INNER JOIN skill ON skill.id = studentskill.skill_id 
    WHERE skill.id in (1,2) 
    group by student.id, student.username 
    havinge count(distinct studentskill.skill_id)= 2 
+0

1つの質問: – Sskeptix

+0

OK ..それから..質問.. – scaisEdge

+0

または私の答えが正しい場合はそれをマークしてください...どのようにここに表示 http://meta.stackexchange.com/questions/5234/how-does-受付中の回答 – scaisEdge

関連する問題