2016-04-21 8 views
0

In meiner Datenbank habe ich mehrere Tabellen mit "Viele-zu-viele" Beziehungen, die sich gegenseitig referenzieren, und die Art und Weise, wie ich diese Abfragen durchgeführt habe, erfolgte über eingebettete Abfragen.

Ich habe über "viele zu viele" Beziehungen gelesen, und wie man sie mit "Innerer Join" abfragt, aber ich bin nicht in der Lage, Abfragen zu finden, die zu dem passen, wonach ich suche, und seitdem Meine Datenbank wird mit sehr großen Tabellen arbeiten Ich möchte nicht, dass mein Code Leistungsprobleme hat.Gibt es eine bessere Möglichkeit, diese mysql-Abfrage mit internen Join-Befehlen zu erstellen?

SELECT salones.idSalon, 
     salones.Lat, 
     salones.Long, 
     recursos.idRecurso, 
     recursos.Recurso 
FROM salones, 
    recursos, 
    salones_has_recursos 
WHERE salones_has_recursos.salones_idSalon=salones.idSalon 
    AND salones_has_recursos.recursos_idRecurso=recursos.idRecurso 
    AND recursos.idRecurso IN (SELECT idRecurso 
          FROM salones_has_recursos 
          WHERE idRecurso IN (SELECT idRecurso 
               FROM recursos 
               WHERE recurso = 'Audiovisual' 
               ) 
          ) 

Ich weiß, eingebettete Abfragen haben, ist ein Leistungskiller, aber das ist der einzige Weg, ich konnte Figur, wie die Informationen, die ich aus der Tabelle benötigen. Weiß jemand, wie man dieses Ergebnis mit "inner join" -Befehlen bekommt?

The resulting table should look a little like this

This is the all the data content of the tables

+0

sqlfiddle.com einige Testdaten und zeigen gewünschte Ausgabe, bitte. –

+0

Sag einfach Nein zu "Komma verbindet" – Uueerdo

Antwort

0

versuchen diese, ist es schwer, ohne sqlfiddle zu testen, aber versuchen Sie dies und sehen.

SELECT salones.idSalon, 
     salones.Lat, 
     salones.Long, 
     recursos.idRecurso, 
     recursos.Recurso 
FROM salones 
    INNER JOIN salones_has_recursos ON salones_has_recursos.salones_idSalon=salones.idSalon 
    INNER JOIN recursos ON salones_has_recursos.recursos_idRecurso=recursos.idRecurso 
    AND recursos.idRecursor = salones_has_recursors.idRecurso 
    AND recursos.recurso = 'Audiovisual' 
1

ich dir es einen Starter in der Hoffnung, die Sie herausfinden können, wie es funktioniert:

Dieses:

select idRecurso from salones_has_recursos where idRecurso in 
(select idRecurso from recursos where recursos = 'Audiovisual'); 

Becomes:

select 
    s.idRecurso 
from 
    salones_has_recursos s 
    inner join recursos r 
    on s.idRecurso = r.idRecurso 
    where r.recursos = 'Audiovisual'; 

kann ich 't garantieren, dass es funktioniert ohne ein Mittel zu testen, aber ich denke, das ist Ihre vollständige Lösung:

SELECT 
    s.idSalon, 
    s.Lat, 
    s.Long, 
    r.idRecurso, 
    r.Recurso 
FROM 
    salones s 
    inner join recursos r 
    on s.idRecurso = r.idRecurso 
    and r.recursos = 'Audiovisual' 
    inner join salones_has_recursos sr 
    on sr.salones_idSalon=s.idSalon 
    and sr.recursos_idRecurso=r.idRecurso; 
0

I denken Dies ist die entsprechende JOIN-Abfrage. Die Verbindung von r1, shr1 und r2 scheint für mich mehr als ein bisschen "off" zu sein; Ich bin mir nicht sicher, ob das an einem Fehler bei der Konvertierung liegt oder ob es vom Original übernommen wurde.

SELECT s2.idSalon, 
     s2.Lat, 
     s2.Long, 
     r2.idRecurso, 
     r2.Recurso 
FROM recursos AS r1 
INNER JOIN salones_has_recursos AS shr1 ON r1.idRecurso = shr1.idRecurso 
INNER JOIN recurso AS r2 ON shr1.idRecurso = r2.idRecurso 
INNER JOIN salones_has_recursos AS shr2 ON r2.idRecurso = shr2.recursos_idRecurso 
INNER JOIN salones AS s2 ON shr2.salones_idSalon=s2.idSalon 
WHERE r1.recurso = 'Audiovisual' 
; 

Es ist auch die gleichen Ergebnisse nicht 100% garantiert geben, wie es Art eines impliziten DISTINCT in IN Operationen ist.


von "off" Ich meine das:

recursos.idRecurso IN (SELECT idRecurso 
          FROM salones_has_recursos 
          WHERE idRecurso IN (SELECT idRecurso 
               FROM recursos 
               WHERE recurso = 'Audiovisual' 
               ) 
          ) 

scheint dies äquivalent zu sein: recursos.recurso = 'Audiovisual'