Hoe kan ik alle resultaten ophalen tussen deze twee getallen die zijn opgeslagen met commas
Dit is mijn query:
Code (php)
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
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
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?
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.
Toevoeging op 14/02/2019 20:11:29:
Maar dit werkt blijkbaar ook al (geen expliciete cast nodig):
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
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.
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.
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.
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.
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.
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
Thomas van den Heuvel op 15/02/2019 16:43:09:
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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
+----------------+
| 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 :).
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.
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.
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.
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
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?
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?
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.