我正在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的多列。当我在应用程序中单击课程名称时,我想查看该课程下的所有学生。怎么做?(数据库和查询)
我建议使用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)列出相关行的名称(映射表仅用于显示值,因为它们对于最终用户几乎没有用)
第二个查询利用一些聚合函数,这些函数根据所选行的分组方式(GROUP BY)(分为子集)组合值。按路线分组。 count函数返回集合中的行数,group_concat函数返回集合中指定表达式(通常为列)的所有值的逗号分隔列表。