2016-07-01 15 views
1

Als jemand, der ständig Probleme mit Datenbanken hat, versuche ich nach einer Lösung zu suchen, die meine Datenbankaufrufe optimiert. Szenario ist dies, ich versuche, alle Zeilen von Elementen direkt im Besitz des Benutzers zu erhalten, aber ich möchte auch die Zeilen von Elementen abrufen, wo die Benutzerrollen als Gast fungiert. Meine aktuelle Anfrage funktioniert, aber ich denke, es ist nicht die beste Lösung für das, was ich erreichen möchte. Diese erhalten Sie mir die Ergebnisse, die ich will, aber ich fürchte, wenn es Hunderte von Zeilen sind diese schrecklich langsam bekommenJoin verschiedene WHERE-Klauseln auf mySQL multiple Select-Anweisung

set @UsrId = 23; 
(SELECT Eventos.Fecha, Eventos.InformacionDelEvento, Eventos.PosicionGpsSiNo, Eventos.InformacionGps, Dispositivos.Nombre, CatalogoDeEventos.Descripcion 
FROM Eventos, CatalogoDeEventos, Dispositivos, DispositivosxUsuario 
WHERE Eventos.IdEvento = CatalogoDeEventos.Id 
AND Dispositivos.IdentificadorUnico = Eventos.IdDispositivo 
AND DispositivosxUsuario.IdDispositivo = Dispositivos.Id 
AND Dispositivos.Invisible = 0 
AND DispositivosxUsuario.IdUsuario = @UsrId 
ORDER BY Fecha DESC) 
UNION 
(SELECT Eventos.Fecha, Eventos.InformacionDelEvento, Eventos.PosicionGpsSiNo, Eventos.InformacionGps, Dispositivos.Nombre, CatalogoDeEventos.Descripcion 
FROM Eventos, CatalogoDeEventos, Dispositivos, DispositivosxUsuario, Seguidores 
WHERE Eventos.IdEvento = CatalogoDeEventos.Id 
AND Dispositivos.IdentificadorUnico = Eventos.IdDispositivo 
AND DispositivosxUsuario.IdDispositivo = Dispositivos.Id 
AND Dispositivos.Invisible = 0 
AND Seguidores.IdUsuario = DispositivosxUsuario.IdUsuario 
AND Seguidores.IdSeguidor = @UsrId 
ORDER BY Fecha DESC) 

Also beide Abfragen haben diese gleichen Block

SELECT Eventos.Fecha, Eventos.InformacionDelEvento, Eventos.PosicionGpsSiNo, Eventos.InformacionGps, Dispositivos.Nombre, CatalogoDeEventos.Descripcion 
FROM Eventos, CatalogoDeEventos, Dispositivos, DispositivosxUsuario 
WHERE Eventos.IdEvento = CatalogoDeEventos.Id 
AND Dispositivos.IdentificadorUnico = Eventos.IdDispositivo 
AND DispositivosxUsuario.IdDispositivo = Dispositivos.Id 
AND Dispositivos.Invisible = 0 

Sie auf den Linien darüber abweichen , bisher habe ich keinen Weg, um die beiden Ergebnisse auf einem einzigen Aufruf

+2

verwenden moderne 'JOIN' Join-Syntax, anstatt eine Abfrage Stil, der vor 20 Jahren veraltet war; es würde es offensichtlich machen, dass Sie wahrscheinlich 'LINKE VERBINDEN Sequidores' – Uueerdo

+0

@Uueerdo Ich lerne immer noch Datenbanken, wenn Sie können Sie mich Dokumentation (oder Beispiele) verknüpfen, habe ich versucht, die Oracle zu lesen, aber ich bin immer noch zu Neuling um es vollständig zu verstehen –

+0

Ich ging voran und schrieb die Abfrage mit der neueren Joinsyntax neu. @Uueerdo hat Recht, es ist viel einfacher zu lesen. – nlloyd

Antwort

1

dachte das

SELECT Eventos.Fecha, Eventos.InformacionDelEvento, Eventos.PosicionGpsSiNo,  Eventos.InformacionGps, Dispositivos.Nombre, CatalogoDeEventos.Descripcion 
FROM Eventos, CatalogoDeEventos, Dispositivos, DispositivosxUsuario, Seguidores 
WHERE Eventos.IdEvento = CatalogoDeEventos.Id 
    AND Dispositivos.IdentificadorUnico = Eventos.IdDispositivo 
    AND DispositivosxUsuario.IdDispositivo = Dispositivos.Id 
    AND Dispositivos.Invisible = 0 
    AND Seguidores.IdUsuario = DispositivosxUsuario.IdUsuario 
    AND (
     (Seguidores.IdUsuario = DispositivosxUsuario.IdUsuario 
     AND Seguidores.IdSeguidor = @UsrId) 
     OR DispositivosxUsuario.IdUsuario = @UsrId) 
ORDER BY Fecha DESC 
arbeiten sollten

Wie in den Kommentaren erwähnt wurde, ist dies effektiv Links auf Sequidores und das wäre wahrscheinlich deutlicher gewesen, wenn die Abfrage mit der neueren Joinsyntax geschrieben wurde.

Re-geschrieben neuer verwendet Syntax

SELECT e.Fecha, e.InformacionDelEvento, e.PosicionGpsSiNo, e.InformacionGps, d.Nombre, cde.Descripcion 
FROM Eventos e 
    INNER JOIN CatalogoDeEventos cde ON e.IdEvento = cde.Id 
    INNER JOIN Dispositivos d ON d.IdentificadorUnico = e.IdDispositivo 
    INNER JOIN DispositivosxUsuario du ON du.IdDispositivo = d.Id 
    LEFT JOIN Seguidores s ON s.IdUsuario = du.IdUsuario 
WHERE d.Invisible = 0 
    AND (Seguidores.IdSeguidor = @UsrId 
     OR DispositivosxUsuario.IdUsuario = @UsrId) 
ORDER BY Fecha DESC 
+0

Es ist großartig, ich kann beide Abfragen vergleichen, um einander zu verstehen und die anderen zu tun. –

+0

Froh ich könnte helfen :) – nlloyd