Waarom kan ik niet filteren op IS NOT NULL in deze query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

30/01/2018 15:19:03
Quote Anchor link
Ik probeer alle NULL resultaten uit mijn resultaat te filteren.

Maar met de volgende query krijg ik een error:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.
 
PHP hulp

PHP hulp

22/12/2024 05:21:28
 
Thomas van den Heuvel

Thomas van den Heuvel

30/01/2018 16:02:25
Quote Anchor link
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.
 
Snelle Jaap

Snelle Jaap

31/01/2018 10:19:20
Quote Anchor link
**quoteknip**
Hij heeft niet altijd een waarde, vandaar dat er soms een resultaat terugkomt dat NULL is. Ik wil graag die resultaten wegfilteren.
Gewijzigd op 31/01/2018 17:38:55 door - Ariën -
 
Ivo P

Ivo P

31/01/2018 10:34:24
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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.
 
Snelle Jaap

Snelle Jaap

31/01/2018 11:06:43
Quote Anchor link
**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
Gewijzigd op 31/01/2018 17:38:38 door - Ariën -
 
Ivo P

Ivo P

31/01/2018 11:10:23
Quote Anchor link
ik zie dat ik mijn eerste antwoord niet volledig heb aangepast:
ben stukje in WHERE vergeten te wissen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
 
Snelle Jaap

Snelle Jaap

31/01/2018 11:31:31
Quote Anchor link
**quoteknip**

Deze werkt inderdaad. Bedankt, ik denk dat ik het snap. Zal het nog wel een paar keer vaker moeten gebruiken.
Gewijzigd op 31/01/2018 17:38:16 door - Ariën -
 
Obelix Idefix

Obelix Idefix

31/01/2018 17:32:13
Quote Anchor link
@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.
Gewijzigd op 31/01/2018 17:32:41 door Obelix Idefix
 
- Ariën  -
Beheerder

- Ariën -

31/01/2018 17:40:00
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.