在mySQL multiple select语句中加入不同的WHERE子句

时间:2016-07-01 20:45:48

标签: mysql

作为经常遇到数据库问题的人,我正在尝试寻找一种优化数据库调用的解决方案。方案就是这样,我正在尝试获取用户直接拥有的所有项目行,但我也想获取用户角色充当访客的项目行。我当前的查询有效,但我认为这不是我想要实现的最佳锻造解决方案。这让我得到了我想要的结果,但我担心当有数百行时,这会非常缓慢

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

他们在上面的行上有所不同,到目前为止我还没有找到一种方法可以在一次通话中获得两个结果

1 个答案:

答案 0 :(得分:1)

这应该有效

<system.transactions>
     <defaultSettings timeout="00:59:00" />
</system.transactions>

正如评论中提到的那样,这实际上会在Sequidores上留下连接,如果查询是使用较新的连接语法编写的话,这可能会更加明显。

重写以使用更新的连接语法

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