Mysql
 sql >> Base de données >  >> RDS >> Mysql

Colonne inconnue dans la liste des champs lors de l'utilisation de SUM(something) AS a

Vous ne pouvez pas sélectionner une colonne que vous avez définie au même niveau dans votre SELECT clause. Si vous souhaitez réutiliser une expression, vous devez recourir à une table dérivée :

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

Ou, bien sûr, vous répétez simplement l'expression :

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 vous voulez juste ordonner par cette expression, alors c'est possible sans aucune astuce (mais vous ne pouvez toujours pas SELECT l'expression au même niveau de votre requête)

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 raison en est expliquée dans cet article de blog ici

Note complémentaire

En dehors des explications ci-dessus, bien sûr, je ne pense pas que votre requête soit correcte. Puisque vous regroupez uniquement par b.user , vous obtiendrez une valeur aléatoire pour a.user et probablement vos sommes sont incorrectes et vous obtenez un produit cartésien accidentel, à mon avis. Mais c'est un sujet pour une autre question.