2016-07-01 45 views
1

作爲一個經常遇到數據庫問題的人,我試圖尋找一種解決方案來優化我的數據庫調用。情景是這樣的,我試圖獲取用戶直接擁有的所有行項目,但我也想獲取用戶角色充當訪客的項目行。我目前的查詢工作,但我認爲這不是我想要實現的最好的僞造解決方案。這使我得到我想要的結果,但我當有數百行,這將得到非常緩慢在mySQL多選語句中加入不同的WHERE子句

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) 

所以這兩個查詢具有此相同的塊

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 

他們上面這行不同的恐懼,到目前爲止,我還沒有想出一個單一的電話獲取兩個結果的方式

+2

運用現代'JOIN'語法,而不是20年前已經過時的查詢風格;它會使它很明顯,你可能會''LEFT JOIN Sequidores' – Uueerdo

+0

@Uererdo我還在學習數據庫,如果你能連接我的文檔(或例子),我已經嘗試閱讀甲骨文的,但我仍然太新手了充分理解它 –

+0

我繼續並使用較新的連接語法重新編寫查詢。 @Uueerdo是對的,閱讀起來更容易。 – nlloyd

回答

1

這應該工作

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 

就像在註釋中提到的那樣,這實際上留下了對Sequidores的連接,如果查詢是使用較新的連接語法編寫的,那麼這可能會更加明顯。

重新編寫,使用新加入的語法

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

它很棒,我可以比較兩個查詢以完全理解另一個,並執行其他操作。 –

+0

很高興我可以幫助:) – nlloyd