sql >> Base de Datos >  >> RDS >> Mysql

Columna desconocida en la lista de campos cuando se usa SUM (algo) COMO

No puede seleccionar una columna que haya definido en el mismo nivel en su SELECT cláusula. Si desea reutilizar una expresión, debe recurrir al uso de una tabla derivada:

SELECT x.*, (common_p_count+common_r_count)
FROM (
  SELECT 
    a.user AS a_user, 
    b.user AS b_user, 
    SUM(a.post = b.post) AS common_p_count,
    SUM(a.option = b.option) AS common_r_count
  FROM response a, response b
  WHERE a.user = '1' AND b.user != '1' group by b.user
) x

O, por supuesto, simplemente repite la expresión:

SELECT 
  a.user AS a_user, 
  b.user AS b_user, 
  SUM(a.post = b.post) AS common_p_count,
  SUM(a.option = b.option) AS common_r_count,
  (SUM(a.post = b.post) + SUM(a.option = b.option))
FROM response a, response b
WHERE a.user = '1' AND b.user != '1' group by b.user

Si solo desea ordenar por esa expresión, entonces eso es posible sin ningún truco (pero aún no puede SELECT la expresión en el mismo nivel de su consulta)

SELECT 
  a.user AS a_user, 
  b.user AS b_user, 
  SUM(a.post = b.post) AS common_p_count,
  SUM(a.option = b.option) AS common_r_count
FROM response a, response b
WHERE a.user = '1' AND b.user != '1' group by b.user
ORDER BY common_p_count + common_r_count

La razón de esto se explica en este artículo de blog aquí

Nota al margen

Además de las explicaciones anteriores, por supuesto, no creo que su consulta sea correcta. Dado que está agrupando solo por b.user , obtendrá un valor aleatorio para a.user y probablemente sus sumas sean incorrectas y obtenga un producto cartesiano accidental, en mi opinión. Pero ese es un tema para otra pregunta.