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ă eNULL
). De ce nu știi dacă există coloana respectivă? Păi… poți avea unLEFT JOIN
, de exemplu. - Poți face media aritmetică a unei coloane folosind
AVG
. Tot aici am aflat că ar trebui să folosești șiDISTINCT
, pentru a nu include și valorile ce se repetă. - Nu poți folosi alias-ul
unui
unei coloane într-unJOINWHERE
. Pentru asta, ai nevoie deHAVING
.
Î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
Poate era bine sa adaugi si tag-ul ‘WordPress’ la articolul asta
fii antena:
.. FROM wp_users u
…
join wp_usermeta um on …
…
join rating r on..
where
the_fuck_you_do_that_for?
AND ..(um.meta_key …
….
GROUP BY u.ID
ps. avarage-ul ala nu-i alias-ul unui join.
@alescx: fac piggyback la query-urile din wp. Dacă ai sugestii, sunt binevenite
Alias e pentru coloană, dar eram pe fugă când am scris și mi s-au amestecat ideile
De fapt having se foloseste pentru a filtra rezultatele dupa ce s-a aplicat group by, alias-urile join-ului merg bine mersi in where.
@Empire: Vezi ce am scris un comentariu mai sus
M-am prins de greșeală când eram pe drumuri.
@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.”