[mysql] WHERE of HAVING

Pagina: 1
Acties:

  • aOk
  • Registratie: September 2000
  • Niet online
Ik weet dat je voor HAVING eerst altijd GROUP BY moest gebruiken om het te gebruiken (nu niet meer word automatisch ook al gedaan)
en ik heb hier een query waar je zogiezo een GROUP BY voor nodig hebt omdat ik met AVG enzo werk..
Ik heb het proberen op te zoeken op de mysql-pagina en hier op GoT, maar kon er niet uitkomen waarom de query met WHERE (deze)
code:
1
2
3
4
5
SELECT koppel.slachtdatum, koppel.Houderijvorm, Round(Avg(gehakttest.Kiemgetal)) AS GemVanKiemgetal, 
Round(Avg(gehakttest.Entero)) AS GemVanEntero, 
Round(Avg(gehakttest.Ecoli)) AS GemVanEcoli 
FROM koppel INNER JOIN gehakttest ON koppel.KOPPELID = gehakttest.KOPPELID 
WHERE koppel.slachtdatum LIKE '%2004-07-%' GROUP BY koppel.Houderijvorm


wel werkt ..
Er zijn 2 tabellen een heet koppel en de andere heet gehaktest.. er kunnen meerdere gehakttesten worden gemaakt per koppel en er kunnen meerdere koppels worden geslacht op 1 dag. Ze zijn dus gekoppeld met
code:
1
 INNER JOIN gehakttest ON koppel.KOPPELID = gehakttest.KOPPELID


Ik wil nu per houderijvorm zien welke gemiddelde resultaten er worden gegeven.

Ik heb hier formulieren voor gemaakt die deze queries (er zijn nog veel meer queries) makkelijk kunnen verwerken en waar je op kunt filteren/ sorteren.
Het probleem is dat ik tot nu toe altijd zo veel mogelijk met HAVING werkte en dat eigenlijk zo wil aanhouden

met having heb ik de volgende formule ..
code:
1
2
3
4
SELECT koppel.slachtdatum, koppel.Houderijvorm, Round(Avg(gehakttest.Kiemgetal)) AS GemVanKiemgetal, 
Round(Avg(gehakttest.Entero)) AS GemVanEntero, Round(Avg(gehakttest.Ecoli)) AS GemVanEcoli 
FROM koppel INNER JOIN gehakttest ON koppel.KOPPELID = gehakttest.KOPPELID GROUP BY koppel.Houderijvorm 
HAVING 1 AND slachtdatum LIKE '%2004-07-%' ORDER BY slachtdatum DESC


en daar komen dus geen resultaten uit en ook geen error

Dus het probleem zal wel liggen dat having alleen betrekking heeft op de GROUP koppel.Houderijvorm, maar kan iemand me nou precies uitleggen wat het probleem is?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

* curry684 snapt het probleem niet echt. WHERE geeft een conditie op het rapen van de data, HAVING geeft een conditie op de uitgepoepte data. Simple as that :)

En daarnaast is de bug in je 2e query dat je geen aggregate functie loslaat op de slachtdatum, dat kan helemaal niet (en slikt buggy MySQL-meuk wel). Lees P&W FAQ - SQL eens :)

Professionele website nodig?


Verwijderd

Als je gebaat bent bij een paar stukjes voorbeeldd-SQL kan je de queries in bv MS-Access bouwen en kijken (nadat je 3 miljard haakjes hebt verwijderd ;) ) wat die ervan maakt.

  • Skaah
  • Registratie: Juni 2001
  • Niet online
SQL:
1
...AND slachtdatum LIKE '%2004-07-%'...

Kan:
SQL:
1
...AND slachtdatum LIKE '2004-07-%'... 
(Dus zonder het eerste procentteken, zo kun je wel indeces gebruiken)
of
code:
1
...AND YEAR(slachtdatum) = 2004 AND MONTH(slachtdatum) = 7
(Nog sneller, want het is geen string vergelijking. Ik ga er even vanuit dat dit wel een datum-veld is)

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 18:11

Reinier

\o/

offtopic:
En wtf is zogiezo? Is dat weer een slechte variant op sowieso?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 11:34

Goodielover

Only The Best is Good Enough.

Je moet in ieder geval de velden waarop je niet aggregeert in de group by hebben staan, dus ook de datum.

je having clause conditie kan dus net zo goed (beter) in de where staan.

[ Voor 28% gewijzigd door Goodielover op 11-10-2004 11:56 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Skaah schreef op 10 oktober 2004 @ 15:24:
code:
1
...AND YEAR(slachtdatum) = 2004 AND MONTH(slachtdatum) = 7
(Nog sneller, want het is geen string vergelijking. Ik ga er even vanuit dat dit wel een datum-veld is)
Maar die gebruikt geen indices :P
Dus is
code:
1
AND slachtdatum BETWEEN '2004-07-01' AND '2004-07-31'

Waarschijnlijk nog sneller.
Pagina: 1