Ik probeer alle NULL resultaten uit mijn resultaat te filteren.

Maar met de volgende query krijg ik een error:


SELECT
  cnt.id,
  cnt.title,
  cnt.introtext,
  cnt.fulltext,
  cnt.ordering,
  cnt.images,
  cnt.alias,
  cnt.state,
  f.item_id,
  MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) AS inslider
FROM snm_fields_values f
JOIN snm_content cnt
  ON cnt.id = f.item_id
WHERE cnt.state = 1
AND f.value = 'ja'
AND inslider IS NOT NULL
GROUP BY f.item_id
ORDER BY f.item_id, inslider


unknown column 'inslider' is wat ik dan krijg te zien. Ik las dat je in een where geen alias kunt gebruiken, maar mijn vraag is: hoe moet het dan wel?

Ik kan het niet vinden op internet.

Om de een of andere reden (wanneer ik die IS NOT NULL regel die een error geeft weghaal) haalt hij ook rijen op waarbij inslider de value NULL heeft.
Let's see. inslider heeft alleen een waarde als f.field_id gelijk is aan 3? Als je dat nu eens naar de WHERE verplaatst? En is ook gegarandeerd dat f.value (dan of in het algemeen) altijd een waarde heeft?

En waar gaat deze query uberhaupt over? Misschien is er een andere manier om dit probleem op te lossen.
**quoteknip**
Hij heeft niet altijd een waarde, vandaar dat er soms een resultaat terugkomt dat NULL is. Ik wil graag die resultaten wegfilteren.
Eenvoudigste is vaak om het hele stuk dat je een alias geeft, ter herhalen in de WHERE.
NB: je mist ook een heel stuk in GROUP BY, aangezien je daar alle kolommen moet noemen (niet zijnde aggregatie functies zoals MAX


Alternatief kan ook HAVING zijn in dit geval:


SELECT
  cnt.id,
  cnt.title,
  cnt.introtext,
  cnt.fulltext,
  cnt.ordering,
  cnt.images,
  cnt.alias,
  cnt.state,
  f.item_id,
  MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) AS inslider
FROM snm_fields_values f
JOIN snm_content cnt
  ON cnt.id = f.item_id
WHERE cnt.state = 1
AND f.value = 'ja'
AND MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) IS NOT NULL
GROUP BY   cnt.id,
  cnt.title,
  cnt.introtext,
  cnt.fulltext,
  cnt.ordering,
  cnt.images,
  cnt.alias,
  cnt.state,
  f.item_id
HAVING MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) IS NOT NULL 
ORDER BY f.item_id, inslider 


Mogelijk dat je daar wel de alias kunt gebruiken in Mysql. Mag je zelf even testen.
**quoteknip**

HAVING kwam ik inderdaad ook al tegen, ik had daar nog nooit van gehoord dus het is even inlezen hoe dat nou precies werkt. De query boven geeft overigens de volgende error: Ongeldig gebruik van GROUP-functie
ik zie dat ik mijn eerste antwoord niet volledig heb aangepast:
ben stukje in WHERE vergeten te wissen:


SELECT
  cnt.id,
  cnt.title,
  cnt.introtext,
  cnt.fulltext,
  cnt.ordering,
  cnt.images,
  cnt.alias,
  cnt.state,
  f.item_id,
  MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) AS inslider
FROM snm_fields_values f
JOIN snm_content cnt ON cnt.id = f.item_id
WHERE cnt.state = 1
  AND f.value = 'ja'
GROUP BY  
  cnt.id,
  cnt.title,
  cnt.introtext,
  cnt.fulltext,
  cnt.ordering,
  cnt.images,
  cnt.alias,
  cnt.state,
  f.item_id
HAVING MAX(CASE
    WHEN f.field_id = 3 THEN f.value
  END) IS NOT NULL
ORDER BY f.item_id, inslider 
**quoteknip**

Deze werkt inderdaad. Bedankt, ik denk dat ik het snap. Zal het nog wel een paar keer vaker moeten gebruiken.
@jaap: waarom quote je in jouw reacties de voorgaande post in zijn geheel?
Je topic wordt daardoor onnodig lang (en onoverzichtelijk).
Quote (en zeker hele reacties) aub alleen als het toegevoegde waarde heeft.
Ik heb de quote even ingeknipt. Ik wil Snelle Jaap graag verzoeken om geen quotes van het laatst voorgaande bericht te plaatsen. Zo blijft het topic makkelijk leesbaar.

Reageren