Объединение нескольких записей из разных таблиц в одну строку - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь использовать studentID, чтобы получить их имя и фамилию из одной таблицы, затем получить результаты для одной из своих домашних работ, используя HomeworkID, и отобразить результаты в виджете списка с помощью tkinter. Однако прежде чем он может быть отображен, конечно, мне сначала нужно иметь возможность получить данные. Это то, что я до сих пор:

 def viewresults (self, sethw):

        print (self.Homework_To_Set.get())
        #resultslist = []
        conn = sqlite3.connect('MyComputerScience.db')
        c = conn.cursor()
        homeworkID = c.execute("SELECT HWID FROM HomeworkInfo WHERE HomeworkName = ?", (self.Homework_To_Set.get(), )).fetchone()
        studentsnamecheck = c.execute("SELECT StudentID FROM HomeworkSet WHERE  HWID = ?", ((homeworkID[0], ))).fetchall()
        if len(studentsnamecheck) == 0:
            self.View_Results.insert(END, "No one has completed this homework!")
        else:
            for x in studentsnamecheck:
                c.execute("SELECT FName || ' ' || SName FROM users WHERE UserID = ?", (str(x), ))
                res1 = (c.fetchall())
                for i in (studentsnamecheck):
                    result_collect = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?", ((str(i)), self.Homework_To_Set.get() ))

                var_insert_results = ((res1), (result_collect))
                self.View_Results.insert(END, str(var_insert_results))

И это текущий вывод:

([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)

Это схема для баз данных:

c.execute("""CREATE TABLE IF NOT EXISTS users (
            UserID INTEGER PRIMARY KEY AUTOINCREMENT,
            FName text,
            SName text,
            username text,
            password text,
            userType text,
            ClassName text);""")

c.execute("""CREATE TABLE IF NOT EXISTS ClassInfo (
            ClassID INTEGER PRIMARY KEY AUTOINCREMENT,
            ClassName text,
            Teacher text);""")

c.execute("""CREATE TABLE IF NOT EXISTS HomeworkInfo (
            HWID INTEGER PRIMARY KEY,
            HomeworkName text);""")


c.execute("""CREATE TABLE IF NOT EXISTS HomeworkSet (
            HWID integer,
            StudentID text,
            Results text,
            FOREIGN KEY (StudentID) REFERENCES users(UserID)
            FOREIGN KEY (HWID) REFERENCES HomeworkInfo(HWID));""")

1 Ответ

0 голосов
/ 19 марта 2020

В вашем коде есть несколько проблем:

c.execute("SELECT FName || ' ' || SName FROM users WHERE UserID = ?", (str(x), ))
res1 = (c.fetchall())
for i in (studentsnamecheck):
    result_collect = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?",
                               ((str(i)), self.Homework_To_Set.get() ))
  • Нет UserID поле в таблице users; это может быть username
  • str(x) должно быть x[0]
  • должно l oop через res1 вместо studentsnamecheck
  • str(i) должно быть x[0]
  • self.Homework_To_Set.get() должно быть homeworkID[0]

Таким образом, код должен быть:

def viewresults(self, sethw):
    print(self.Homework_To_Set.get())
    conn = sqlite3.connect('MyComputerScience.db')
    c = conn.cursor()
    homeworkID = c.execute("SELECT HWID FROM HomeworkInfo WHERE HomeworkName = ?",
                           (self.Homework_To_Set.get(),)).fetchone()
    studentsnamecheck = c.execute("SELECT StudentID FROM HomeworkSet WHERE HWID = ?",
                                  (homeworkID[0],)).fetchall()
    if len(studentsnamecheck) == 0:
        self.View_Results.insert(END, "No one has completed this homework!")
    else:
        for x in studentsnamecheck:
            c.execute("SELECT FName||' '||SName FROM users WHERE username = ?", (x[0],))
            res1 = c.fetchall()
            for i in res1:
                results = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?",
                                    (x[0], homeworkID[0])).fetchone()
                self.View_Results.insert(END, '%-30s  %s'%(i[0], results[0]))

Однако вы можете объединить SELECT операторы в один запрос:

def viewresults(self, sethw):
    conn = sqlite3.connect('MyComputerScience.db')
    c = conn.cursor()
    sql = """
        SELECT SName||' '||FName, Results
        FROM HomeworkSet, HomeworkInfo, users
        WHERE HomeworkInfo.HomeworkName = ?
          AND HomeworkInfo.HWID = HomeworkSet.HWID
          AND HomeworkSet.StudentID = users.username
    """
    c.execute(sql, (self.Homework_To_Set.get(),))
    for result in c:
        self.View_Results.insert(END, '%-30s  %s'%result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...