hallo,

ik heb weer een vraagje.
ik ben op zoek naar een manier om mijn database uit te lezen dermate van zoek kriteria.
nu heb ik 1 input veld en dit werpt top!
full textsearch heb ik ook naar gekeken maar naar zo iets ben ik niet op zoek.
ik wil dus bijvoorbeeld 3 input velden onder elkaar :

1 voor zoeken op username
2 voor zoeken op id
3 voor zoeken op mail adres

nu heb ik bij de input name verschillende namen gemaakt dus bv.
zoek1
zoek2
zoek3

en bij mijn query heb ik dit ingevuld :


$query = "SELECT * FROM `user` WHERE (`username` LIKE '%".$zoek1."%' OR `id` LIKE '%".$zoek2."%'OR `usermail` LIKE '%".$zoek3."%'";  




maar als ik nu 3 zoekvelden heb maakt het niet uit wat ik invul maar ik krijg altijd alle gegevens te zien uit de database.

dit komt denk ik door de lege velden.

wat kan ik hier tegen doen???
birthday is een veld 0000-00-00

hierbij wil ik dus kunnen zoeken tussen 2 data (BETWEEN)

dus in mensen taal staat er volgens mij in de code

zoek bij 'birthday' tussen datum (nu) en interval $zoekwoord5 (dus bijvoorbeeld 11) zoek alleen Jaartal en tussen datum (nu) en interval $zoekwoord4 (bijvoorbeeld 15) zoek alleen jaartal

dus dan zou hij moeten zoeken alle users die tussen de 11 en 15 jaar zijn.

het eerste voorbeeld werkt prima alleen dan werkt alleen dus de BETWEEN zoekfunctie en niet de losse zoekfuncties.
als ik de BETWEEN regel weg haal dan werken de andere zoekfuncties weer.
In het WHERE-deel van een query leg je extra condities (voorwaarden) op die aangeven waar de gegevens die je ophaalt aan moeten voldoen.

Je kunt meerdere condities opgeven, en deze worden meestal verbonden met AND of OR.

De manier waarop je condities aan elkaar hangt bepaalt welke voorwaarden er moeten gelden.

Stel dat A, B en C (verschillende) condities zijn.

Als je WHERE-deel er als volgt uitziet:

A AND B

Dan houdt dit in dat de opgehaalde gegevens zowel aan A als aan B moeten voldoen (A èn B).

Als je WHERE-deel er als volgt uitziet:

A AND B AND C

Dan houdt dit in dat de opgehaalde gegevens aan alledrie moeten voldoen (A èn B èn C).

Als je daarintegen OR gebruikt zijn de "eisen" wat losser:

A OR B

Houdt in dat er ofwel aan A of aan B moet zijn voldaan (of aan beide, dat is ook goed).

A OR B OR C

Hoeft er zelfs maar aan 1 van de 3 criteria voldaan te zijn of 2 uit 3, of alledrie, dat levert in al die gevallen resultaten op (maar waarschijnlijk niet dezelfde).

Als je AND en OR gaat combineren dan heeft een van de twee "voorrang" (net zoals bij rekenen: machtsverheffen komt voor vermenigvuldigen komt voor delen etc.) maar naar mijn mening kun je beter expliciet zijn in wat je bedoelt:

(A AND B) OR C

levert namelijk hele andere resultaten op dan:

A AND (B OR C)

Simpelweg omdat de haakjes die aangeven welke condities met elkaar geassocieerd zouden moeten worden op een andere plaats staan.

Zoals Jan voorstelt: probeer te verwoorden wat je probeert te bereiken, en probeer dat met bovenstaand verhaal om te zetten in een query, of geef aan wat je probeert te bereiken als dit niet lukt.
TOP UITLEG!
dit ga ik zeker even proberen ik kom hier later op terug!

bedankt!
Wat jij wilt is dus:

<een of andere leeftijdsberekening> BETWEEN <ingevulde_min_leeftijd> AND <ingevulde_max_leeftijd>
ja klopt thomas!

dus de rest zou naar verluid een OR moeten zijn en alleen de leeftijds berekening een AND
en dat zou dan ook tussen BETWEEN () moeten staan
Op stackoverflow stond deze oplossing:
YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))

Wat er in feite gebeurt: Je pakt het verschil in jaren, en corrigeert dit verschil als de verjaardag nog niet geweest is door er nog een extra jaar vanaf te trekken. Hierbij wordt een beetje misbruik gemaakt van hoe er omgegaan wordt met typen, zoals ook in dat bericht staat.

Als je voor date1 NOW() invult en voor date2 de kolomnaam van de geboortedatum dan is dat je leeftijdsberekening.
Waarom omslachtige workarounds verzinnen als er een functie voor bestaat:

WHERE TIMESTAMPDIFF(YEAR, birth_date, CURRENT_DATE) BETWEEN 20 AND 30
Ger van Steenderen op 29/03/2015 15:05:12
Waarom omslachtige workarounds verzinnen als er een functie voor bestaat

Omdat wellicht niet iedereen weet van het bestaan van zo'n functie? Ik kon deze zo gauw niet vinden.

Het is fijn dat er een kortere oplossing bestaat, maar in eerste instantie is een werkende oplossing ook goed.

Je had ook kunnen reageren met "hier is een functie voor" in plaats van een retorische vraag. Dat staat wat... vriendelijker.
Ben ik weer even.

Thomas ik heb het geprobeerd met OR maar als ik deze toevoeg dan laat hij altijd alles zien (dus geen selectie)
ik denk dat hij dan ook de lege velden mee rekend van de andere zoek criteria.

die timestamp van Ger ziet er ook logisch uit.

als ik dit in mijn script wil toepassen dan heb ik dit geprobeerd maar dit werkt niet.

<?
AND (`birthday` TIMESTAMPDIFF(YEAR, birth_date, CURRENT_DATE) BETWEEN '$zoekwoord5' AND '$zoekwoord4')
?>

Het is:

AND TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE) BETWEEN 20 AND 40

Maar je zat eerder ook al in de goede richting want dit kan ook:

AND birthday BETWEEN (CURRENT_DATE - INTERVAL 40 YEAR) AND (CURRENT_DATE - INTERVAL 20 YEAR)

Het verschil tussen:

<elke keer een berekening over kolom> BETWEEN <constante waarde> AND <constante waarde>

Of

<kolomwaarde> BETWEEN <constante waarde> AND <constante waarde>

Waarbij die constante waardes voortkomen uit een eenmalige berekening.

Reageren