Ce am învățat azi: HAVING, AVG și COALESCE

Ce am învățat azi: HAVING, AVG și COALESCE

Azi m-am luptat parte în parte cu SQL. Am învățat următoarele:

  • Poți folosi COALESCE( col, default_value) pentru a seta o valoare default în cazul în care nu există coloana respectivă (sau dacă e NULL). De ce nu știi dacă există coloana respectivă? Păi… poți avea un LEFT JOIN, de exemplu.
  • Poți face media aritmetică a unei coloane folosind AVG. Tot aici am aflat că ar trebui să folosești și DISTINCT, pentru a nu include și valorile ce se repetă.
  • Nu poți folosi alias-ul unui JOIN unei coloane într-un WHERE. Pentru asta, ai nevoie de HAVING.

În fine, tot cârnatul a ajuns să arate așa:

select
  sql_calc_found_rows wp_users.ID,
  avg(distinct coalesce(rating.average, 0)) as average ,
  SUM(distinct coalesce(rating.total, 0)) as total
from
  wp_users
inner join wp_usermeta on
  ( wp_users.ID = wp_usermeta.user_id )
left join rating on
  ( wp_users.ID = rating.rated_id )
where
  1 = 1
  and ( ( ( wp_usermeta.meta_key = 'wp_capabilities'
  and wp_usermeta.meta_value like '%\"professional\"%' )
  or ( wp_usermeta.meta_key = 'wp_capabilities'
  and wp_usermeta.meta_value like '%\"business\"%' ) ) )
group by
  wp_users.ID
having
  average > 1
order by
  average desc,
  total desc
limit 0,
20

6 Comentarii

Empire a scris

@Ionuț Staicu: Te cred, dar nu ai editat corect articolul. Nu e corect: „Nu poti folosi alias-ul unei coloane in where, ci ai nevoie de having”. Corect este:

Mysql-ul aplica WHERE-ul, apoi face GROUP BY, unde din cauza agregarii cu AVG rezulta o noua coloana average, apoi poti filtra din nou folosind HAVING.

Nu alias-ul e problema, ci faptul ca atunci cand se proceseaza WHERE-ul, coloana aia inca nu exista.

https://www.w3schools.com/sql/sql_having.asp

„The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions.”

Adaugă un comentariurăspuns pentru

Link-urile în context sunt binevenite. Comentariile fără nume/email valid sunt șterse.
PS: Comentariul NU este editabil.

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Site-ul blog.iamntz.com utilizează cookie-uri. Continuarea navigării presupune acceptarea lor. Mai multe informații.

windows apple dropbox facebook twitter