首页 > 解决方案 > 如何从关系表中获取数据(多对多)

问题描述

在此处输入图像描述

我有这三个主要表Microdisenoscompetenciasresultados

我的问题是:我想知道属于 microdisenos 的能力结果是什么

我知道当关系是一对多时该怎么做,但在这种情况下它是多对多的,我不知道如何处理这些中间表。

谢谢你的帮助。

标签: mysqlsql

解决方案


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" )
                              )
                );

推荐阅读