Reputation: 173
I have these three main tables Microdisenos, competencias and resultados.
My problem is this: I want to know what are the resultados that belong to the competencias of a microdisenos.
I know how to do it when relationships are one to many, but in this case it is many to many and I do not know how to handle those intermediate tables.
Thanks for your help.
Upvotes: 0
Views: 77
Reputation: 907
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";
The result would be:
# id, description
---- ---------------
1, Resultados 11
2, Resultados 22
Option 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" )
)
);
Upvotes: 1
Reputation: 322
The only way is to join throught all the columns:
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
And if you want to select just the once that belong to one specific microdesendo add the WHERE clause with m.id
Upvotes: 1