Hoe kan ik alle resultaten ophalen tussen deze twee getallen die zijn opgeslagen met commas

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

14/02/2019 15:55:31
Quote Anchor link
Ik heb een query waarmee ik alle producten binnen een prijsrange wil ophalen. Dat werkte prima voordat ik prijzen heb opgeslagen met commas erin.

Dit is mijn query:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
SELECT   *
FROM     (
   SELECT    cnt.id    AS content_id,
             cnt.title AS content_title,
             cnt.featured,
             cnt.ordering,
             cnt.alias AS content_alias,
             cnt.catid,
             cnt.images,
             cnt.state,
             cnt.introtext,
             cat.parent_id,
             cat.id    AS cat_id,
             cat.title AS cat_title,
             cat.alias AS cat_alias,
             Max(
             CASE
                       WHEN f.field_id = 6 THEN f.value
             END) AS prijs,
             Max(
             CASE
                       WHEN f.field_id = 7 THEN f.value
             END) AS prijsoud,
             Max(
             CASE
                       WHEN f.field_id = 8 THEN f.value
             END) AS afbeelding
   FROM      snm_categories cat
   LEFT JOIN snm_content cnt
   ON        cnt.catid = cat.id
   AND       cnt.state = 1
   LEFT JOIN snm_fields_values f
   ON        cnt.id = f.item_id
   WHERE     cat.parent_id = 8
   GROUP BY  cnt.id,
             cnt.title,
             cnt.featured,
             cnt.alias,
             cnt.catid,
             cnt.images,
             cnt.state,
             cnt.introtext,
             cat.id,
             cat.title,
             cat.alias )t
WHERE    prijs BETWEEN 154.95 AND      314.95
AND      t.content_id IS NOT NULL
ORDER BY ordering


De waardes in de database zijn (laagste en hoogste) 154,95 en 314,95, het aanpassen van de query naar commas werkt niet, dan stopt hij helemaal met werken. Zoals hij nu is zie ik via mijn prijsfilter alleen het product met de hoogste prijs, het product van 154,94 wordt niet getoond.

Hoe kan ik dit oplossen?
 
PHP hulp

PHP hulp

23/03/2019 16:30:50
 
Thomas van den Heuvel

Thomas van den Heuvel

14/02/2019 17:22:37
Quote Anchor link
Snelle Jaap op 14/02/2019 15:55:31:
prijzen met commas erin.

Dit eruit slopen?

Ooit overwogen om alles in centen op te slaan? Geen komma's of punten in die oplossing.
 
Rob Doemaarwat

Rob Doemaarwat

14/02/2019 20:04:31
Quote Anchor link
Of gewoon even een conversieslag en de varchars-met-prijs (ik neem aan dat het dat zijn) als een echte decimal of float opslaan. Prijzen in centen opslaan is ook altijd weer zo'n gedoe met rekenen en presenteren (x100, /100, op een gegeven moment vergeet je het een keer en staat alles te duur/goedkoop op de site).

Toevoeging op 14/02/2019 20:11:29:

Maar dit werkt blijkbaar ook al (geen expliciete cast nodig):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE replace(prijs,',','.') BETWEEN 154.95 AND 314.95
 
Thomas van den Heuvel

Thomas van den Heuvel

14/02/2019 23:19:12
Quote Anchor link
Hoef je dan geen CAST te doen? Anders is het toch een alfabetische vergelijking in plaats van een numerieke vergelijking? Kom je dan niet in de problemen? Wellicht lost die BETWEEN het op? REPLACE lijkt mij nog steeds niet erg efficiënt. En los daarvan lijkt het mij beter om getallen (al dan niet met decimalen) ook echt in een soort van numerieke kolom op te slaan.

Er is iets mis met je database-ontwerp op het moment dat je je data eerst nog moet gaan vertalen voordat je deze kunt gebruiken.
Gewijzigd op 14/02/2019 23:25:03 door Thomas van den Heuvel
 
Snelle Jaap

Snelle Jaap

15/02/2019 10:30:28
Quote Anchor link
Thomas van den Heuvel op 14/02/2019 23:19:12:
Hoef je dan geen CAST te doen? Anders is het toch een alfabetische vergelijking in plaats van een numerieke vergelijking? Kom je dan niet in de problemen? Wellicht lost die BETWEEN het op? REPLACE lijkt mij nog steeds niet erg efficiënt. En los daarvan lijkt het mij beter om getallen (al dan niet met decimalen) ook echt in een soort van numerieke kolom op te slaan.

Er is iets mis met je database-ontwerp op het moment dat je je data eerst nog moet gaan vertalen voordat je deze kunt gebruiken.


Ik gebruik joomla als basis en de velden waar deze waardes vandaan komen zijn prijsvelden dus de gebruiker (een nederlander) gaat commas gebruiken in plaats van punten. En om nou aan de joomla structuur te gaan rommelen.. dan los ik het liever anders op. Ik ga het is met bovenstaande proberen te fixen.
 
Nick Vledder

Nick Vledder

15/02/2019 15:43:52
Quote Anchor link
@Snelle Jaap

Opslag in de database staat in feite (redelijk) los van presentatie in de browser. Kortom, in de webapp kun je best getallen met comma's presenteren, terwijl je in de database deze bedragen opslaat als "decimal". Persoonlijk zou ik geen "float" gebruiken overigens.
 
Snelle Jaap

Snelle Jaap

15/02/2019 16:22:07
Quote Anchor link
Nick Vledder op 15/02/2019 15:43:52:
@Snelle Jaap

Opslag in de database staat in feite (redelijk) los van presentatie in de browser. Kortom, in de webapp kun je best getallen met comma's presenteren, terwijl je in de database deze bedragen opslaat als "decimal". Persoonlijk zou ik geen "float" gebruiken overigens.



Ja snap ik maar dat opslaan gebeurd dus door Joomla en ik ga liever niet in de code van Joomla zitten veranderen. Een andere optie is aan de gebruiker uitleggen dat hij punten gebruikt in plaats van commas, maarja met bovenstaande code is het al opgelost.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2019 16:43:09
Quote Anchor link
Snelle Jaap op 15/02/2019 10:30:28:
En om nou aan de joomla structuur te gaan rommelen..

Hoe slaat Joomla dit dan op?

En wat @Nick zegt: je kunt dit prima opslaan als een decimaal getal met een punt zodat je er makkelijk mee kunt rekenen. Hoe je dit verder weergeeft is vers twee.
Gewijzigd op 15/02/2019 16:44:26 door Thomas van den Heuvel
 
Snelle Jaap

Snelle Jaap

15/02/2019 16:50:35
Quote Anchor link
Thomas van den Heuvel op 15/02/2019 16:43:09:
Snelle Jaap op 15/02/2019 10:30:28:
En om nou aan de joomla structuur te gaan rommelen..

Hoe slaat Joomla dit dan op?

En wat @Nick zegt: je kunt dit prima opslaan als een decimaal getal met een punt zodat je er makkelijk mee kunt rekenen. Hoe je dit verder weergeeft is vers twee.


Het is een textveld, dus gewoon als string. Wanneer je 149,99 invoert dan slaat hij ook 149,99 op in de database.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2019 16:57:57
Quote Anchor link
Mja maar dingen textueel vergelijken is iets anders dan dingen numeriek vergelijken. Dus tenzij er op een of andere manier een typecast plaatsvindt zou dit soms onvoorspelbare resultaten kunnen geven (zelfs als je het in het goede formaat maar in een tekstuele kolom opslaat):

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
sql> SELECT 125.00 > 35.00;
+----------------+
| 125.00 > 35.00 |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

sql> SELECT '125.00' > '35.00';
+--------------------+
| '125.00' > '35.00' |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)

Je bent gewaarschuwd :).
 
Ivo P

Ivo P

18/02/2019 13:17:39
Quote Anchor link
Joomla is webshop software.

Ik kan me niet voorstellen dat daarin de prijzen opgeslagen worden als tekst. Dat zou namelijk betekenen dat bij het optellen van de bedragen in je winkelmandje al rekening gehouden moet worden met alle opties die een beheerder kan hebben verzonnen om bedragen op te slaan:

- 4.95
- 4,95
- € 4.95
- € 4,95
- 495
- 4,95 EUR

Daar kun je nooit mee rekenen.
Weet je zeker dat het hier om het prijs-veld gaat en dat er niet een of ander veld van de product-beschrijving wordt misbruikt voor de prijs?

Het feit dat je werkt met field_id;-value paren, lijkt daar al op te wijzen.
 
Snelle Jaap

Snelle Jaap

18/02/2019 15:23:52
Quote Anchor link
Ivo P op 18/02/2019 13:17:39:
Joomla is webshop software.

Ik kan me niet voorstellen dat daarin de prijzen opgeslagen worden als tekst. Dat zou namelijk betekenen dat bij het optellen van de bedragen in je winkelmandje al rekening gehouden moet worden met alle opties die een beheerder kan hebben verzonnen om bedragen op te slaan:

- 4.95
- 4,95
- € 4.95
- € 4,95
- 495
- 4,95 EUR

Daar kun je nooit mee rekenen.
Weet je zeker dat het hier om het prijs-veld gaat en dat er niet een of ander veld van de product-beschrijving wordt misbruikt voor de prijs?

Het feit dat je werkt met field_id;-value paren, lijkt daar al op te wijzen.

Joomla is toch gewoon een CMS? Magento bedoel je denk ik.

En het is een tekstveld die ik zelf heb gemaakt, binnen Joomla heb je de mogelijkheid om custom fields aan te maken en die aan paginas te koppelen.
 
Adoptive Solution

Adoptive Solution

18/02/2019 15:50:52
Quote Anchor link
Volgende keer een numeriek veld maken. Misschien kan je het huidige veld wijzigen..

https://docs.joomla.org/Number_form_field_type

Een standaard input veld van type number accepteert zowel een decimale komma als een decimale punt.

Aan de serverkant worden beide een decimale punt.
Gewijzigd op 18/02/2019 15:51:28 door Adoptive Solution
 
Ivo P

Ivo P

18/02/2019 15:52:06
Quote Anchor link
ik dacht dat er ook een stuk webshop bij zat. Maar dat is niet zo.

In elk geval, wat hierboven ook gezegd wordt min of meer:
getallen moet je als getal opslaan.
Zonder nadere opmaak. Maar ook voor de database als getal.

Net zoals "z" groter is dan "aa" is "9" groter dan "11" als je het als een string beschouwd ipv een getal. En een varchar is een string.

Kun je aangeven dat het om getallen gaat?
 
Snelle Jaap

Snelle Jaap

21/02/2019 12:38:28
Quote Anchor link
Ivo P op 18/02/2019 15:52:06:
ik dacht dat er ook een stuk webshop bij zat. Maar dat is niet zo.

In elk geval, wat hierboven ook gezegd wordt min of meer:
getallen moet je als getal opslaan.
Zonder nadere opmaak. Maar ook voor de database als getal.

Net zoals "z" groter is dan "aa" is "9" groter dan "11" als je het als een string beschouwd ipv een getal. En een varchar is een string.

Kun je aangeven dat het om getallen gaat?

Het is nu opgelost door het veld aan te passen naar een numeriek veld. Dus vergelijken tussen de getallen zou nu goed moeten werken.
 



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.