Column of unknown subquery

1

Could someone help me with this query?

He says that the column "hasNovedadHoy" is unknown in the clause WHERE , however if I remove it from WHERE and leave it in ORDER BY , It works.

But I think that if you recognize it in the clause ORDER BY the should recognize in the clause WHERE .

SELECT sicor_seguimientos.*, jurisdicciones.nombre AS 
nombre_jurisdiccion, CASE WHEN EXISTS (SELECT id FROM sicor_registros 
WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = 
CURDATE()) THEN TRUE ELSE FALSE END AS TieneNovedadHoy, (SELECT fecha 
FROM sicor_registros WHERE sicor_registros.IdSeguimiento = 
sicor_seguimientos.id ORDER BY fecha DESC LIMIT 1) As UltimaActualizacion 
FROM sicor_seguimientos INNER JOIN jurisdicciones ON jurisdicciones.id = 
sicor_seguimientos.IdJurisdiccion WHERE TieneNovedadHoy is TRUE AND 
usuario ='anderson' ORDER BY TieneNovedadHoy DESC
    
asked by Anderson 29.05.2018 в 04:02
source

2 answers

1

Indeed it is so, what happens is that the ORDER is the last thing that "processes" the engine, so in that instance the alias of the calculated column does exist, however at the time of processing the filters the WHERE said column has not yet been resolved, so it gives you an error.

MySql in particular allows you to do the following in these cases:

SELECT (CASE WHEN EXISTS (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE()) THEN TRUE ELSE FALSE END) AS TieneNovedadHoy 
      FROM sicor_seguimientos 
      INNER JOIN jurisdicciones 
         ON jurisdicciones.id = sicor_seguimientos.IdJurisdiccion 
      WHERE usuario ='anderson' 
      HAVING TieneNovedadHoy IS TRUE    
      ORDER BY TieneNovedadHoy DESC

HAVING TieneNovedadHoy IS TRUE in other dialects of SQL is invalid because the having is only valid together with clauses GROUP BY , but as I said, MySQL allows it. The most ANSI SQL form would be:

Repeat subquery in WHERE

SELECT (CASE WHEN EXISTS (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE()) THEN TRUE ELSE FALSE END) AS TieneNovedadHoy 
      FROM sicor_seguimientos 
      INNER JOIN jurisdicciones 
         ON jurisdicciones.id = sicor_seguimientos.IdJurisdiccion 
      WHERE (CASE WHEN EXISTS (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE()) THEN TRUE ELSE) is TRUE 
            AND usuario ='anderson' 
      ORDER BY TieneNovedadHoy DESC

Use a subquery

SELECT TieneNovedadHoy
    FROM (SELECT CASE WHEN EXISTS (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE()) THEN TRUE ELSE FALSE END AS TieneNovedadHoy 
                FROM sicor_seguimientos 
                INNER JOIN jurisdicciones 
                    ON jurisdicciones.id = sicor_seguimientos.IdJurisdiccion 
                WHERE usuario ='anderson'
        ) T
        WHERE T.TieneNovedadHoy IS TRUE
        ORDER BY T.TieneNovedadHoy DESC

Solve it with LEFT JOIN

I do not see that you can not do it this way too:

SELECT (CASE WHEN sicor_registros.IdSeguimiento IS NOT NULL THEN TRUE ELSE FALSE END) AS TieneNovedadHoy 
      FROM sicor_seguimientos 
      INNER JOIN jurisdicciones 
         ON jurisdicciones.id = sicor_seguimientos.IdJurisdiccion 
      LEFT JOIN sicor_registros
         ON sicor_registros.IdSeguimiento = sicor_seguimientos.id
         AND sicor_registros.fecha = CURDATE() 
      WHERE (CASE WHEN sicor_registros.IdSeguimiento IS NOT NULL THEN TRUE ELSE FALSE END) is TRUE 
            AND usuario ='anderson' 
      ORDER BY TieneNovedadHoy DESC
    
answered by 29.05.2018 / 04:35
source
0

I managed to solve it.

Column aliases are not allowed in the WHERE clause because when it is executed the value of the column has not yet been determined.

The solution was:

SELECT sicor_strays. *, jurisdictions. AS name Jurisdiction_name, CASE WHEN EXISTS (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE ()) THEN TRUE ELSE FALSE END AS HasNovedadToday, (SELECT date FROM sicor_registers WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id ORDER BY date DESC LIMIT 1) As UltimaUpdate FROM sicor_seguimientos INNER JOIN jurisdicciones ON jurisdicciones.id = sicor_seguimientos.IdJurisdiccion WHERE (SELECT id FROM sicor_registros WHERE sicor_registros.IdSeguimiento = sicor_seguimientos.id AND fecha = CURDATE ()) is TRUE AND user = 'anderson' ORDER BY HaveNovedadToday DESC

    
answered by 29.05.2018 в 04:18