mysql - 如何从关系表中获取数据(多对多)
问题描述
我有这三个主要表Microdisenos、competencias和resultados。
我的问题是:我想知道属于 microdisenos 的能力的结果是什么。
我知道当关系是一对多时该怎么做,但在这种情况下它是多对多的,我不知道如何处理这些中间表。
谢谢你的帮助。
解决方案
CREATE DATABASE testDB;
USE testDB;
CREATE TABLE microdisenos (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
description VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE competencias (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
modulo VARCHAR(128),
PRIMARY KEY (id)
);
CREATE TABLE competencia_microdiseno (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
microdiseno_id INTEGER UNSIGNED,
competencia_id INTEGER UNSIGNED,
PRIMARY KEY (id),
FOREIGN KEY (microdiseno_id) REFERENCES microdisenos (id),
FOREIGN KEY (competencia_id) REFERENCES competencias (id)
);
CREATE TABLE resultados (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
description VARCHAR(256),
PRIMARY KEY (id)
);
CREATE TABLE competencia_resultado(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
resultado_id INTEGER UNSIGNED,
competencia_id INTEGER UNSIGNED,
PRIMARY KEY (id),
FOREIGN KEY (resultado_id) REFERENCES resultados (id),
FOREIGN KEY (competencia_id) REFERENCES competencias (id)
);
INSERT INTO competencias VALUES (0, 'Compentencia AA');
INSERT INTO competencias VALUES (0, 'Compentencia BB');
INSERT INTO competencias VALUES (0, 'Compentencia CC');
INSERT INTO competencias VALUES (0, 'Compentencia DD');
INSERT INTO competencias VALUES (0, 'Compentencia EE');
INSERT INTO microdisenos VALUES (0, 'Microdisenos 101');
INSERT INTO microdisenos VALUES (0, 'Microdisenos 202');
INSERT INTO microdisenos VALUES (0, 'Microdisenos 303');
INSERT INTO microdisenos VALUES (0, 'Microdisenos 404');
INSERT INTO microdisenos VALUES (0, 'Microdisenos 505');
INSERT INTO resultados VALUES (0, 'Resultados 11');
INSERT INTO resultados VALUES (0, 'Resultados 22');
INSERT INTO resultados VALUES (0, 'Resultados 33');
INSERT INTO resultados VALUES (0, 'Resultados 44');
INSERT INTO resultados VALUES (0, 'Resultados 55');
INSERT INTO competencia_microdiseno VALUES(0, 1, 1);
INSERT INTO competencia_microdiseno VALUES(0, 1, 2);
INSERT INTO competencia_microdiseno VALUES(0, 1, 3);
INSERT INTO competencia_microdiseno VALUES(0, 2, 4);
INSERT INTO competencia_microdiseno VALUES(0, 2, 5);
INSERT INTO competencia_microdiseno VALUES(0, 3, 1);
INSERT INTO competencia_microdiseno VALUES(0, 3, 2);
INSERT INTO competencia_microdiseno VALUES(0, 4, 3);
INSERT INTO competencia_microdiseno VALUES(0, 4, 4);
INSERT INTO competencia_microdiseno VALUES(0, 4, 5);
INSERT INTO competencia_microdiseno VALUES(0, 5, 1);
INSERT INTO competencia_microdiseno VALUES(0, 5, 2);
INSERT INTO competencia_microdiseno VALUES(0, 5, 3);
INSERT INTO competencia_resultado VALUES(0, 1, 1);
INSERT INTO competencia_resultado VALUES(0, 2, 2);
INSERT INTO competencia_resultado VALUES(0, 3, 3);
INSERT INTO competencia_resultado VALUES(0, 4, 4);
INSERT INTO competencia_resultado VALUES(0, 5, 5);
INSERT INTO competencia_resultado VALUES(0, 1, 1);
INSERT INTO competencia_resultado VALUES(0, 2, 2);
INSERT INTO competencia_resultado VALUES(0, 3, 3);
INSERT INTO competencia_resultado VALUES(0, 4, 4);
INSERT INTO competencia_resultado VALUES(0, 5, 5);
INSERT INTO competencia_resultado VALUES(0, 1, 1);
INSERT INTO competencia_resultado VALUES(0, 2, 2);
INSERT INTO competencia_resultado VALUES(0, 3, 3);
-- Give me all (unique) Resultados for Compentencias for given Microdisenos
SELECT DISTINCT r.*
FROM resultados r, competencia_resultado cr, competencias c, competencia_microdiseno cm, microdisenos m
WHERE r.id = cr.resultado_id
AND c.id = cr.competencia_id
AND c.id = cm.competencia_id
AND m.id = cm.microdiseno_id
AND m.description = "Microdisenos 303";
结果将是:
# id, description
---- ---------------
1, Resultados 11
2, Resultados 22
选项 2: 子查询
SELECT DISTINCT r.*
FROM resultados r
WHERE r.id IN ( SELECT DISTINCT cr.id
FROM competencia_resultado cr
WHERE cr.competencia_id IN (
SELECT DISTINCT c.id
FROM competencias c
WHERE c.id IN (
SELECT DISTINCT cm.competencia_id
FROM competencia_microdiseno cm, microdisenos m
WHERE m.id = cm.microdiseno_id
AND m.description = "Microdisenos 303" )
)
);
推荐阅读
- c++ - Qt C++:如何添加一个简单的倒数计时器?
- java - java.lang.NoClassDefFoundError:无法初始化类 org.apache.commons.text.StringEscapeUtils
- c# - 在设计器中打开自定义用户控件时,Visual Studio Professional 15.9.2 崩溃
- java - ArrayList 对象按整数排序
- python - 如何使用熊猫转换这个文件?
- c - 较大值的错误动态内存分配
- java - JAVA - 如何将 Spring Boot 应用程序与 SQL Server 2016(具有 Windows 身份验证)连接?
- javascript - Google Apps 脚本库和脚本分发
- javascript - 如何将不和谐登录添加到 Chrome 扩展程序
- html - CSS 背景图像不会加载 Django 2.1.2