MySQL having težava

Imam problem pri sestavi SQL stavka.

Za lažjo predstavo: v tabeli news se nahajajo novice (id, title, dtadded ...), v tabeli newsvotes pa like/dislike posamezne novice (id, newsid, userid, up (1 ali -1) ...). V stavku sicer manjka par pogojev, ki so odstranjeni zaradi preglednosti.

Stavek bi naj vrnil IDje novic, ki imajo razmerje (seštevek glasov / čas od objave) večje od 10 ter jih razporedil po tem pogoju. Order by deluje, težave pa mi povzroča having del.

SELECT n.id
FROM news n
LEFT OUTER JOIN newsvotes nv ON (nv.newsid = n.id)
GROUP BY n.id
HAVING ((SUM(nv.up))/TIMESTAMPDIFF(SECOND, n.dtpublished, NOW())) > '10.0'
ORDER BY ((SUM(nv.up))/TIMESTAMPDIFF(SECOND, n.dt
published, NOW())) ASC

Ena izmed rešitev je, da nastavim cron in te vrednosti zapišem v tabelo news, vendar v tem primeru nimam live rezultatov, bi pa pridobil na hitrosti (ki pa trenutno ni problem).

Kako rešit problem? Obstaja elegantnejša rešitev?

Hvala za odgovore.

EDiT: MySQL javi 'Unknown column n.dt_published'.'

4 odgovori

morda dtadded namesto dtpublished?

Razen če dt_published obstaja ločeno in delaš po njem?

1

Kolikor jaz vem, having gleda po rezultatih in bi moral dat še n.dt_published v select.
Sam to je počasno.

Namesto s cronom lahko ob vsakem votu zapišeš SUM v novico al pa samo prišteješ 1, da ni treba niti SUM-a delat.

2

Ja, karkoli imaš v HAVING moraš izbrati s SELECT (npr. * ali eksplicitno tisti stolpec).

2

Ah, ne morem verjet ... Se mi je zdelo, da bo neka malenkost. Sem dodal še to polje v select in deluje (ne vem, kako mi je to ušlo iz glave).

@Gogy ... Ja, sem napisal samo dtadded, vendar obstaja tudi polje dtpublished.

@blackmamba ... To bi prišlo v poštev, vendar potrebujem datumske rezultate (dnevna, tedenska, mesečna in all-time statistika).

Fantje, hvala!