如何从关系表中获取数据(很多)

时间:2019-06-04 21:36:26

标签: mysql sql

enter image description here

我有这三个主表 Microdisenos 竞争能力结果

我的问题是:我想知道属于 microdisenos competencias resultados

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

唯一的方法是在所有列中进行联接:

SELECT * (or whatever you need)
FROM resultados r
 INNER JOIN competencia_resultado cr
  ON r.id = cr.resultado_id
 INNER JOIN cometencias c
  ON c.id = cr.cometencia_id
 INNER JOIN competencia_microdisendo cm
  ON c.id = cm.competencia_id
 INNER JOIN microdisendos m
  ON m.id = cm.microdisendo_id

如果只想选择一个特定的微脱氧核糖核酸之一,则在WHERE子句中添加m.id

答案 1 :(得分:1)

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