鍍金池/ 問答/PHP  數(shù)據(jù)庫/ mysql多個(gè)表聯(lián)合排序

mysql多個(gè)表聯(lián)合排序

開發(fā)過程中遇到個(gè)mysql的問題,我有多個(gè)表,多個(gè)表之間有聯(lián)系,每個(gè)表都有單獨(dú)的排序。
course > course_level > course_unit > course_lesson,這四個(gè)表的層級(jí)關(guān)系就是課程下面很多l(xiāng)evel,每個(gè)level下面有多個(gè)unit,每個(gè)unit下面有多個(gè)lesson,所有表的排序字段均為sort,全部是按照升序排列,如果某個(gè)級(jí)別sort相同,就按照id升序排列,例如level表里面id=5的sort是0,id=10的sor也是0,那么id5就排在前,每個(gè)子級(jí)別下的sort互不干擾,例如,course_unit表里面的course_level_id=2,和course_level_id=5的unit都會(huì)出現(xiàn)sort=0,sort=5的情況,意思就是下級(jí)的排序和上級(jí)的排序相關(guān)聯(lián)。

現(xiàn)在我需要根據(jù)course,course_level,course_unit的順序來把course_lesson的順序確定下來,就是整個(gè)課程體系的id排序,請(qǐng)問這個(gè)mysql語句怎么寫?lesson_id大概有1000個(gè),只需要排好序的course_lesson表里面的id字段。

#課程分類表
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `course_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '課程類型(1.語文;2.數(shù)學(xué);)',
  `lesson_type` tinyint(3) NOT NULL DEFAULT '0' COMMENT '課堂類型(0.一對(duì)一試聽課;1.一對(duì)一小班課;2.一對(duì)一大班課;3.一對(duì)多小班課;4.一對(duì)多大班課;5.一對(duì)多小班試聽課)',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '課程名',
  `level_num` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '該課程下總級(jí)別數(shù)量',
  `unit_num` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '該Level下總unit數(shù)',
  `lesson_num` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '該level下總lesson數(shù)',
  `lesson_class_hour` int(8) unsigned NOT NULL DEFAULT '0' COMMENT '該Level下所有Lesson總學(xué)時(shí)(分鐘)',
  `class_hour` int(8) DEFAULT '25' COMMENT '當(dāng)前課程每節(jié)課的上課時(shí)長(zhǎng)',
  `lesson_before_time` int(8) DEFAULT '5' COMMENT '課前備課時(shí)間(分鐘)',
  `lesson_after_time` int(8) DEFAULT '5' COMMENT '課后休息時(shí)間(分鐘)',
  `lesson_interval_time` int(8) DEFAULT '15' COMMENT '課程間隔時(shí)間(分鐘)',
  `sort` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '排序順序,升序排列',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '狀態(tài)(1.正常;2.過期;3.無效;4.刪除)',
  `creator` int(11) unsigned NOT NULL,
  `updator` int(11) unsigned NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `teacher_absence_time` int(8) DEFAULT '15' COMMENT '判定老師上課缺席時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='課程信息表';

#課程等級(jí)表
DROP TABLE IF EXISTS `course_level`;
CREATE TABLE `course_level` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'LevelId',
  `course_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '課程Id',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT 'level名稱,規(guī)則為level1~level6,名稱固定不變',
  `title` varchar(64) NOT NULL DEFAULT '' COMMENT 'Level標(biāo)題',
  `unit_num` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '該Level下總unit數(shù)',
  `lesson_num` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '該level下總lesson數(shù)',
  `lesson_class_hour` int(8) unsigned NOT NULL DEFAULT '0' COMMENT '該Level下所有Lesson總學(xué)時(shí)(分鐘)',
  `sort` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '排序順序,升序排列',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT 'Level狀態(tài)(1.正常;2.過期;3.無效;4.刪除)',
  `creator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建者',
  `updator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新者',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='課程下Level信息表';

#單元表
DROP TABLE IF EXISTS `course_unit`;
CREATE TABLE `course_unit` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'LevelId',
  `course_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '所屬courseId',
  `course_level_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '課程Id',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '單元名',
  `title` varchar(64) NOT NULL DEFAULT '' COMMENT '單元主題名',
  `lesson_num` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '該單元下lesson數(shù)',
  `lesson_class_hour` int(8) unsigned NOT NULL DEFAULT '0' COMMENT '該單元下所有l(wèi)esson總學(xué)時(shí)(分鐘)',
  `sort` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '排序順序,升序排列',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT 'Level狀態(tài)(1.正常;2.過期;3.無效;4.刪除)',
  `creator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建者',
  `updator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新者',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8 COMMENT='課程下單元信息表';

#課程表
DROP TABLE IF EXISTS `course_lesson`;
CREATE TABLE `course_lesson` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'LevelId',
  `course_id` int(11) unsigned NOT NULL,
  `course_level_id` int(11) unsigned NOT NULL,
  `course_unit_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '課程Id',
  `courseware_id` int(11) NOT NULL DEFAULT '0' COMMENT '課件ID',
  `preview_video_id` tinyint(3) NOT NULL DEFAULT '0' COMMENT '課前預(yù)習(xí)視頻',
  `reference_video_id` tinyint(3) NOT NULL DEFAULT '0' COMMENT '課程參考教學(xué)視頻id',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT 'level名稱,規(guī)則為level1~level6,名稱固定不變',
  `title` varchar(64) NOT NULL DEFAULT '' COMMENT '課程標(biāo)題',
  `topic` varchar(64) NOT NULL DEFAULT '' COMMENT '課程主題',
  `subject` text NOT NULL COMMENT '課程目標(biāo)',
  `class_hour` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '課程學(xué)時(shí)(分鐘)',
  `sort` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '排序順序,升序排列',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT 'Level狀態(tài)(1.正常;2.過期;3.無效;4.刪除)',
  `creator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建者',
  `updator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新者',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=763 DEFAULT CHARSET=utf8 COMMENT='課程下Lesson信息表';
回答
編輯回答
風(fēng)畔
SELECT cls.id AS lesson_id,
   c.id AS course_id,
   cl.id AS course_level_id,
   cu.id AS course_unit_id
FROM course c 
INNER JOIN course_level cl 
  ON c.id = cl.course_id
INNER JOIN course_unit cu
  ON c.id = cu.course_id
    AND cl.id = cu.course_level_id
INNER JOIN course_lesson cls
  ON c.id = cls.course_id
    AND cl.id = cls.course_level_id
    AND cu.id = cls.course_unit_id
ORDER BY c.sort, c.id, 
    cl.sort, cl.id, 
    cu.sort, cu.id,
    cls.sort, cls.id
2017年11月17日 12:37