如何在sqlite数据库中关联多个表?

问题描述 投票:-2回答:1

我正在android studio中工作,并且是sqlite的新手。我不明白如何在sqlite中关联多个表。

我的问题:我有3张桌子,说

         table_users(name, Id), 
         table_courses(title, code), 
         table_students(name, id). 

对于table_users的每一列,我想创建table_courses的多列。对于table_courses的每一列,我想创建table_students的多列。当我在应用程序中单击课程名称时,我想查看该课程下的所有学生。怎么做?(数据库和查询)

android database sqlite
1个回答
0
投票

我建议使用3个表,但不建议您定义的3个表。

students和users表只是相互复制,所以这两个表可以成为1个表。

cousres表很好。

第三张表是用于将学生映射到/关联/关联到课程的表,并且将允许许多类型的关系。那是一个学生可能有很多课程,每门课程可能有很多学生。

所以表可能是:-

table_users(id,name,其他列,如果需要的话)table_courses(代码,标题)(其中代码是唯一的)table_user_course(studentId,courseCode)

也许考虑以下关于如何使用以上内容的演示,包括两个包含使用关系的查询:-

/* Recreate tables if they exist */
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS courses;
DROP TABLE IF EXISTS user_courses;
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE IF NOT EXISTS courses (code TEXT PRIMARY KEY, title);
CREATE TABLE IF NOT EXISTS user_courses(userId INTEGER, courseCode INTEGER, PRIMARY KEY(userID,courseCode));

/* Add some testing data */
INSERT INTO users (name) /*<<<< Let sqlite generate the id so just insert the 1 value for name */ 
    VALUES ('Mary') /* Mary will be id 1 */,('Fred') /* Fred will be id 2 */,('Sue') /* Sue will be id 3 */
;
INSERT INTO courses /* no need to define columns to insert into as all columns */
    VALUES ('M100','Mathematics'),('E100','English Language'),('S100','Science'),('G100','Geography')
;
INSERT INTO user_courses
    VALUES
        (1,'M100'),(1,'S100') /* Mary enrolled in maths and science */,
        (3,'G100'),(3,'E100'),(3,'S100') /* Sue in Geog, English and science */,
        (2,'M100'),(2,'E100'),(2,'S100') /* Fred in Maths, English andd Science */
;

SELECT name, code, title FROM users JOIN user_courses ON userID = id JOIN courses ON code = courseCode ORDER BY name;
SELECT title, count() AS enrolled, group_concat(name) 
FROM courses 
    JOIN user_courses ON user_courses.courseCode = courses.code
    JOIN users ON users.id = user_courses.userId
GROUP BY courses.code
;


/* Cleanup testing environment */
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS courses;
DROP TABLE IF EXISTS user_courses;

第一个查询,根据(ODRER BY)列出相关行的名称(映射表仅用于显示值,因为它们对于最终用户几乎没有用)

enter image description here

第二个查询利用一些聚合函数,这些函数根据所选行的分组方式(GROUP BY)(分为子集)组合值。按路线分组。 count函数返回集合中的行数,group_concat函数返回集合中指定表达式(通常为列)的所有值的逗号分隔列表。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.