2016-07-25 6 views
1

So habe ich 3 Tabellen, "Ruta", "track_ruta", "punto_ruta" Ruta hat eine Beziehung von eins zu vielen zu track_ruta und eine andere Beziehung von eins zu vielen zu Punto_Ruta. track_ruta hat auch eine Beziehung von eins zu vielen zu punto_ruta. Ruta bedeutet Route in Spanisch übrigens. Lange Rede kurzer Sinn eine Route hat Tracks und Tracks haben Punkte. Es kann Punkte ohne Tracks geben, die zu einer Route gehören. Deshalb ist es so wie es ist. Ich muss abrufen und suchen nach Daten auf den Punkten und ich muss nach Punkten einer Route suchen. Ich hatte dies als SQL-SatzErstellen einer Ansicht für 3 Tabellen mit ein wenig komplexen Beziehungen

select DISTINCT p.* 
from PuntoRuta p, Ruta r, TrackRuta t 
where ((r.codigo=ROUTEID 
     AND t.ruta.codigo=r.codigo AND p.trackRuta.codigo=t.codigo) 
     OR p.ruta=ROUTEID) 

RouteID die ID

Das funktionierte auf meinem Code ersetzt. Ich benutze DISTINCT nicht gerne. Ich weiß, es ist teuer und es hat lange funktioniert. Bis ein USER Millionen Punkte auf seiner Route hatte und es ewig dauert, selbst wenn ich Limits verwende, zu suchen. Ich musste seit Ewigkeiten nicht mehr mit komplexen db-Beziehungen umgehen, also bin ich wirklich rostig.

Ich bin sehr unscharf, wie man dies in eine Ansicht umwandeln kann. Ich war mit JOINS diese

SELECT * 
FROM punto_ruta AS p 
JOIN track_ruta AS t 
ON p.id_track_ruta=t.id_track_ruta 
JOIN ruta r 
ON r.id_ruta=t.id_ruta 
right OUTER JOIN ruta r1 
ON r1.id_ruta=p.id_ruta 

ich auch, aber es in beiden Fällen JOIN FULL OUTER versucht zu tun, ist nur das Hinzufügen alle meine Routen am Ende. Ich kann keine Punkte hinzufügen, die nur zu einer Route und nicht zu einer Strecke gehören.

Sollte ich 2 Abfragen kombinieren? Wie fügt man diese

SELECT p.* 
FROM punto_ruta AS p 
JOIN ruta AS r 
On r.id_ruta=p.id_ruta 

der Abfrage vor?

+0

Also, wenn ich es richtig verstanden habe, wird Ihre Benutzer für Punkte suchen, und Sie müssen alle Routen zeigen, dass diese Punkte unter sind? – AVK

+0

Nein, sie können nach Punkten unter einer Route suchen. Nur das. Es passiert in der Regel, dass sie nach bestimmten Punkten unter einem Datum einer Route suchen möchten. Route hat Track, Track hat Punkte, es kann auch Punkte geben, die zu einer Route ohne Track gehören. –

+0

Also nur als Beispiel Route 1 kann 2 Tracks haben und jeder Track kann 4 Punkte haben (Zwei davon sind A, B) aber Route 2 kann keine Tracks haben aber 8 Punkte 2 davon sind (A, B)? – AVK

Antwort

2

Let unabhänging Punkte haben null in track_id

r(id, ...) 
t(id, r_id, ...) 
p(id, r_id, t_id, ...) 

select p.* 
    from p 
    where p.r_id = ROUTEID 
    and p.t_id is null 
union all 
select p.* 
    from t left join p on t.id = p.t_id 
    where t.r_id = ROUTEID 
+0

Es funktioniert, aber ich Ihre Antwort in dieser SELECT p tweeked. * Von punto_ruta AS p, track_ruta AS t, Ruta AS r \t WHERE r.id_ruta = t.id_ruta UND t.id_track_ruta = p.id_track_ruta \t UNION ALL \t SELECT P. * \t VON punto_ruta AS p, ruta AS r \t WHERE r.id_ruta = p.id_ruta –

Verwandte Themen