как получить данные из реляционных таблиц (много ко многим) - PullRequest
0 голосов
/ 05 июня 2019

enter image description here

У меня есть три основных таблицы Микродизены , компетенции и resultados .

Моя проблема заключается в следующем: я хочу знать, какие результаты относятся к компетенции микродисенс .

Я знаю, как это сделать, когда отношения один ко многим, но в этом случае много ко многим, и я не знаю, как обращаться с этими промежуточными таблицами.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 05 июня 2019
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: Subquery

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" )
                              )
                );
1 голос
/ 05 июня 2019

Единственный способ - объединить все колонки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...