首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql内连接具有匹配键列但为null的表

Mysql内连接具有匹配键列但为null的表
EN

Stack Overflow用户
提问于 2017-02-28 10:16:40
回答 1查看 275关注 0票数 0

我正试着把四张桌子连接起来。

registration_mtadmission_mtstudent_mtschoolyear_student_lt

目前,registration_mtadmission_mtstudent_mt表都有1记录。除了还没有记录的 for schoolyear_student_lt之外,内部连接所有这三个方面都没有问题。

我希望能够获得schoolyear_student_lt的列,并将其与其他3个表的结果集连接,即使匹配的student_id 有--没有记录。

我想将schoolyear_student_lt中的schoolyear_idstudent_idgradelevel_idsection_idpassed添加到我从join查询where isActive = 0获得的结果集中;

CREATE表语句

代码语言:javascript
运行
复制
CREATE TABLE `registration_mt` (
  `registration_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_type` varchar(45) NOT NULL,
  PRIMARY KEY (`registration_id`)
) ;

CREATE TABLE `admission_mt` (
  `admission_id` int(11) NOT NULL AUTO_INCREMENT,
  `registration_id` int(11) NOT NULL,
  `isComplete` bit(1) NOT NULL DEFAULT b'0',
  `completion_date` datetime DEFAULT NULL,
  PRIMARY KEY (`admission_id`),
  UNIQUE KEY `registration_id_UNIQUE` (`registration_id`),
  CONSTRAINT `fk_admission_mtTABLE_registration_idCOL` FOREIGN KEY (`registration_id`) REFERENCES `registration_mt` (`registration_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ;

CREATE TABLE `schoolyear_student_lt` (
  `schoolyear_id` int(11) NOT NULL,
  `student_id` int(11) NOT NULL,
  `gradelevel_id` int(11) NOT NULL,
  `section_id` int(11) DEFAULT NULL,
  `passed` bit(1) DEFAULT b'0',
  UNIQUE KEY `uk_schoolyear_idCOL_student_idCOL` (`schoolyear_id`,`student_id`)
);

CREATE TABLE `student_mt` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `registration_id` int(11) NOT NULL,
  `entry_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `isGraduated` bit(1) NOT NULL DEFAULT b'0',
  `date_graduated` datetime DEFAULT NULL,
  `isActive` bit(1) DEFAULT b'0' ,
  PRIMARY KEY (`student_id`),
  UNIQUE KEY `registration_id_UNIQUE` (`registration_id`),
  KEY `fk_student_mtTABLE_registration_idCOL_idx` (`registration_id`),
  CONSTRAINT `fk_student_mtTABLE_registration_idCOL` FOREIGN KEY (`registration_id`) REFERENCES `registration_mt` (`registration_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
);

我的INNER-JOIN语句

代码语言:javascript
运行
复制
SELECT 

a.admission_id, 
a.isComplete, 
a.completion_date,
s.student_id,
s.entry_date,
s.isGraduated, 
s.date_graduated, 
s.isActive

FROM admission_mt a 
INNER JOIN registration_mt r ON a.registration_id = r.registration_id
INNER JOIN student_mt s ON s.registration_id = a.registration_id
-- INNER JOIN schoolyear_student_lt sslt ON s.student_id = sslt.student_id
-- LEFT JOIN schoolyear_student_lt sslt ON s.student_id = sslt.student_id 


 WHERE 

 s.isActive = 0 ;

registration_mtadmission_mt,和student_mt表的INSERT语句

代码语言:javascript
运行
复制
START TRANSACTION;

INSERT INTO registration_mt(student_type) VALUES('New'); -- insert to registration_mt

INSERT INTO admission_mt(registration_id)
VALUES(LAST_INSERT_ID()); --insert to admissiont_mt

COMMIT;

START TRANSACTION;

UPDATE admission_mt 
SET isComplete = 1 
WHERE registration_id = 1;

INSERT INTO student_mt(registration_id)
VALUES(1); --insert to student_mt

COMMIT;

我注释掉了-- INNER JOIN schoolyear_student_lt sslt ON s.student_id = sslt.student_id,因为当我在select查询中包含它时,没有得到任何结果,因为-- INNER JOIN schoolyear_student_lt sslt ON s.student_id = sslt.student_id表中还没有记录。

这是我得到的当前结果集。schoolyear_student_lt表中没有列,即使在NULLschoolyear_student_lt.student_id上的NOT NULL中,也不希望添加这些列

schoolyear_student_ltLEFT-JOIN不显示来自NULL的列

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-28 10:20:14

你应该试试LEFT OUTER JOIN

左外部连接的思想是,如果没有连接伙伴,则它接受左关系的行,并使用NULL填充右关系的字段。

还有一个右外连接..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42505948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档