Toon posts:

[MySQL] Where-clause matcht niet *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Naar mijn gevoel iets heel simpels maar het lukt niet:
in db per record twee velden confectie1 en confectie2. deze kunnen numierieke waarden bevatten.
vanuit en form op de site is er een min en max waarde op te geven om te filteren.

De opgegeven waarde (gekozen waarde voor het filter) moet in de twee verlden confectie1 en confectie2 gaan kijken of een record voldoet aan de request:
code:
1
2
3
4
5
6
if ((isset($confectiemaat_min)) && ($confectiemaat_min != 'leeg')) {
$SQLSTMT = $SQLSTMT." AND (confectie1 >= '$confectiemaat_min' OR confectie2 >= '$confectiemaat_min') ";
}
if ((isset($confectiemaat_max)) && ($confectiemaat_max != 'leeg')) {
$SQLSTMT = $SQLSTMT." AND (confectie1 <= '$confectiemaat_max' OR confectie2 <= '$confectiemaat_max') ";
}


Dit werkt niet want stel ik filter dat confectiemaat max 34 is dan komen er nog steeds resultaten waarbij of confectiemaat1 of confectiemaat2 hoger is dan 34...

wat mis ik...

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je bent met je AND/OR logica in de war.

WHERE confectie > confectiemaat_min AND confectie < confectiemaat_max

of andere: WHERE confectie BETWEEN confectiemaat_min AND confectiemaat_max

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
print eens $SQLSTMT uit en zet die eens hier neer.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
code:
1
SELECT * FROM inschrijvers WHERE FIND_IN_SET(1,in_categorie) AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(geboortedatum)), '%Y')+0 >= '17' AND achternaam != '' AND voornaam != '' AND sekse != ''AND foto1 != '' AND (confectie1 <= '35' OR confectie2 <= '35')

Verwijderd

Topicstarter
P_de_B schreef op woensdag 23 februari 2005 @ 10:50:
Je bent met je AND/OR logica in de war.

WHERE confectie > confectiemaat_min AND confectie < confectiemaat_max

of andere: WHERE confectie BETWEEN confectiemaat_min AND confectiemaat_max
confectie is in dit geval 2 velden, confiectie_min en max moeten naar beide velden kijken, between zou dan ook twee keer moeten terugkomen, toch?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-05 22:46

Janoz

Moderator Devschuur®

!litemod

Waarom zijn er twee velden voor confectie maat? Wat zijn de verschillende betekenissen van deze twee velden?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Confectie maten zijn niet altijd constant en de opdrachtgever wilde de mogelijkheid om twee waarden in te vullen voor confectiematen, echter als gebruiker wil je dit niet.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
WHERE (Confectiemaat1 BETWEEN min AND max) OR (Confectiemaat2 BETWEEN min AND max)

Dit zou dan moeten werken denk ik? Ik had niet gezien dat er twee kolommen voor confectiemaat waren.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-05 22:46

Janoz

Moderator Devschuur®

!litemod

Dat je twee maten in kunt voeren snap ik, maar wat betekent het waneer een kledingsstuk 2 maten heeft? Wat betekent de eerste confectie kolom? Wat betekent de tweede kolom?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Topictitel gefixt, lees ajb even de stickies... met "query probleem" kunnen we toch niets 8)7

Professionele website nodig?


Verwijderd

Topicstarter
P_de_B schreef op woensdag 23 februari 2005 @ 11:33:
WHERE (Confectiemaat1 BETWEEN min AND max) OR (Confectiemaat2 BETWEEN min AND max)

Dit zou dan moeten werken denk ik? Ik had niet gezien dat er twee kolommen voor confectiemaat waren.
Dit werkt wel als je altijd een filter van min en max gebruikt, je kan ook alleen filteren op een max waarde en dus het je geen between (of je moet uitgaan van 0 bij geen min waarde en 100 bij geen max waarde)

Verwijderd

Topicstarter
curry684 schreef op woensdag 23 februari 2005 @ 11:38:
Topictitel gefixt, lees ajb even de stickies... met "query probleem" kunnen we toch niets 8)7
thx ik ben echt een beetje van slag....

Verwijderd

Topicstarter
Janoz schreef op woensdag 23 februari 2005 @ 11:34:
Dat je twee maten in kunt voeren snap ik, maar wat betekent het waneer een kledingsstuk 2 maten heeft? Wat betekent de eerste confectie kolom? Wat betekent de tweede kolom?
De betekenis is hetzelfde, de scheiding in twee velden komt voort uit een wens van opdrachtgever om dit in te kunnen vullen omdat afhankelijk van een soort categorie waar iemand in geplaatst is, daarbij is het wenselijk dat er "met twee maten" gemeten kan worden.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op woensdag 23 februari 2005 @ 11:51:
[...]

(of je moet uitgaan van 0 bij geen min waarde en 100 bij geen max waarde)
En dat kan niet?

Desnoods in de SQL query met behulp van de ISNULL functie

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Verwijderd schreef op woensdag 23 februari 2005 @ 11:54:
De betekenis is hetzelfde, de scheiding in twee velden komt voort uit een wens van opdrachtgever om dit in te kunnen vullen omdat afhankelijk van een soort categorie waar iemand in geplaatst is, daarbij is het wenselijk dat er "met twee maten" gemeten kan worden.
Dan had ik waarschijnlijk een 2e tabel gemaakt voor maten, waar elke toegevoegde maat ingevoerd kan worden, zodat er 1 of meerdere maten aan een kledingstuk toegevoegd kunnen worden.

Verwijderd

Topicstarter
P_de_B schreef op woensdag 23 februari 2005 @ 11:59:
[...]

En dat kan niet?

Desnoods in de SQL query met behulp van de ISNULL functie
Alles kan maar ik dacht dat ik mijn foute inschatting (zoals ik lees) kon rechtzetten met een simpele aanpassing in de query...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-05 22:46

Janoz

Moderator Devschuur®

!litemod

Wat ik de hele tijd probeer te achterhalen is of beide maatvelden hetzelfde type waarde hebben of niet. Is het bijvoorbeeld dat in het ene veld S,M,L,XL staat en in de andere 34 36 38 wat dus feitelijk neerkomt op dezelfde maat in een andere 'eenheid' (hierbij kan ook aan andere maatstelsels in verschillende landen worden gedacht), of is het zoals bij spijkerbroeken dat de ene de lengte maat is en de andere de breedte. Beiden vragen namelijk een andere aanpak.

[ Voor 10% gewijzigd door Janoz op 23-02-2005 12:34 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Sorry janoz, ik begreep je vraag niet goed, maar de velden hebben allebei dezelfde typen waarden numeriek 10 tm 120
vb: confectiemaat1 = 34 confectiemaat2 = 36
default waarde = 0

Verwijderd

Topicstarter
Aanpassing gemaakt maar nog steeds results buiten de confectie_max waarde:
Result:
code:
1
SELECT * FROM inschrijvers WHERE FIND_IN_SET(1,in_categorie) AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(geboortedatum)), '%Y')+0 >= '17' AND achternaam != '' AND voornaam != '' AND sekse != ''AND foto1 != '' AND sekse = 'vrouw' AND ((confectie1 BETWEEN '0' AND '34') OR (confectie2 BETWEEN '0' AND '34'))

Query:
code:
1
2
3
if ((isset($confectiemaat_min)) && (isset($confectiemaat_max))) {
$SQLSTMT = $SQLSTMT." AND ((confectie1 BETWEEN '$confectiemaat_min' AND '$confectiemaat_max') OR (confectie2 BETWEEN '$confectiemaat_min' AND '$confectiemaat_max')) ";
}

Records met een confectiemaat van 36 komen nog steeds voor :(

[ Voor 15% gewijzigd door Verwijderd op 23-02-2005 13:54 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
((confectie1 BETWEEN '0' AND '34') AND (confectie2 BETWEEN '0' AND '34'))

OR moet in dit geval AND zijn,probeer het maar eens voor jezelf te beredeneren.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
Ik kan het wel beredeneren maar een voorbeeld is gemakkelijker:
iemand heeft confectiemaat1 = 34 en confectiemaat2 = 36
Als ik AND gebruik en ik filter op confectiemaat_max = 35 dan komt deze persoon niet voor in de results aangezien beide voorwaarden moeten voldoen aan tussen 0 en 35 en 36 valt daar utieraard buiten.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ok, maar dan krijg je toch de OR die je al had?

Mogelijkheid 1: Je laat een record zien als zowel confectiemaat_1 als confectiemaat_2 aan de criteria voldoen --> AND gebruiken

Mogelijkheid 2: Je laat een record zien als of confectiemaat_1 OF confectiemaat_2 aan de criteria voldoen --> OR gebruiken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-05 22:46

Janoz

Moderator Devschuur®

!litemod

Wat wil je nu eigenlijk? Aan het begin zeg je dat je geen resultaten terug wilt hebben die niet binnen de opgegeven limieten vallen, en nu wil je ze juist wel terug hebben?

Misschien moet je eerst even duidelijk hebben wat je nu eigenlijk wilt. Of beter, wat de klant nu eigenlijk wil met die twee velden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Dat dacht ik ook maar als ik OR gebruik met een confectiemaat max = 35 dan komen er resultaten uit waarbij confectiemaat1 > 35 (als ik erachterkom waarom dat is ben ik er ook!)
Waarom weet ik niet maar zowel OR als AND zijn geen passende oplossingen voor mij.

editmode: als 1 van de 2 velden niet is ingevuld en dus defaultwaarde 0 heeft voldoet deze altijd aan de query!!! 8)7

[ Voor 20% gewijzigd door Verwijderd op 23-02-2005 14:38 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ja, dan komen er resultaten waarbij EEN kolom een confectiemaat heeft die tussen 34 en 36 ligt. Dat de andere confectiemaat kolem wel een waarde heeft die buiten de min/max vallen is inherent aan het gebruik van OR, nogmaals als je dat niet wilt moet je AND gebruiken, maar dan moeten dus beide confectiemaat kolommen voldoen aan de min/max voor ze getoond worden.

Je moet je keuze bepalen, meer opties zijn er niet.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
zie editmode vorige bericht, ik moet eerst afvangen dat als een van de twee velden niet is gebruikt deze niet moet worden meegenomen in de query (omdat 0 als waarde altijd voldoet) en dan AND gebruiken..dat moet het zijn toch?

Verwijderd

Verwijderd schreef op woensdag 23 februari 2005 @ 11:54:
[...]


De betekenis is hetzelfde, de scheiding in twee velden komt voort uit een wens van opdrachtgever om dit in te kunnen vullen omdat afhankelijk van een soort categorie waar iemand in geplaatst is, daarbij is het wenselijk dat er "met twee maten" gemeten kan worden.
Tenminste 3 tabellen:
code:
1
inschrijver (1)--(n) maat (n)--(1) inschrijfcategorie


Dat je klant kiest voor een aanpak met 2 velden van gelijke betekenis geeft aan dat hij jou als ontwerper nodig heeft. Voor het zelfde geld hat 'ie de maten in 1 textveld willen hebben met puntkomma's ertussen :> .

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 13-05 18:40
Volgens mij heeft P_de_B het prima uitgelegd, maar ik vat nu niet echt wat je probleem nog is. Je hebt 2 keuzes:

1) selecteer alles waarbij confectie1 EN confectie2 tussen min en max
code:
1
2
3
SELECT * FROM `blaat`
WHERE (`confectie1` > min AND `confectie1` < max)
  AND (`confectie2` > min AND `confectie2` < max);


2) selecteer alles waarbij confectie1 OF confectie2 tussen min en max

code:
1
2
3
SELECT * FROM `blaat`
WHERE (`confectie1` > min AND `confectie1` < max)
   OR (`confectie2` > min AND `confectie2` < max);


De laatste optie baseert de selectie op 1 kolom, dus in de andere kolom kunnen dan "ongeldige" waarden voorkomen. Dus als min < confectie1 < max maar confectie2 > max dan krijg je die in het 2de scenario terug, in het eerste niet... Als beide niet is wat je wilt, wat wil je dan :? :)

Edit: en om te checken op 0 of NULL (scenari02 als voorbeeld)
code:
1
2
3
4
5
6
7
8
9
#Check nul (integerwaarde)
SELECT * FROM `blaat`
WHERE (`confectie1 <> 0 AND `confectie1` > min AND `confectie1` < max)
   OR (`confectie2 <> 0 AND `confectie2` > min AND `confectie2` < max);

#Check NULL (geen waarde)
SELECT * FROM `blaat`
WHERE (`confectie1 IS NOT NULL AND `confectie1` > min AND `confectie1` < max)
   OR (`confectie2 IS NOT NULL AND `confectie2` > min AND `confectie2` < max);

[ Voor 66% gewijzigd door Morrar op 23-02-2005 15:25 ]

Pagina: 1