[MySQL]beschikbaarheidsdatum zoeken

Pagina: 1
Acties:

  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
Ik ben een search functie aan het maken maar me querie wil niet echt lukken

code:
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
    $querie = "SELECT
    foto.fo_id
    FROM
    fotograaf,
    serie,
    foto
    WHERE
    fotograaf.fg_id = serie.fg_id AND
    serie.se_id = foto.se_id AND

    fotograaf.fg_id = '$fg_id' AND

    serie.se_onderwerp like '%$onderwerp%' AND

    serie.se_prijs_pm >= '$prijs_min' AND
    serie.se_prijs_pm <= '$prijs_max' AND
        
    (serie.se_begindatum > '$datum_begin' AND
    serie.se_einddatum > '$datum_begin' AND
    serie.se_begindatum > '$datum_einde' AND
    serie.se_einddatum > '$datum_einde') 
    OR
    (serie.se_begindatum < '$datum_begin' AND
    serie.se_einddatum < '$datum_begin' AND
    serie.se_begindatum < '$datum_einde' AND
    serie.se_einddatum < '$datum_einde')
    
    ";


Ik het de querie hierboven an geprobeerd
het gaat om het gedeelde van de beschikbaarheids datum
ik dacht als ik die nu tussen haakjes zet dan zou het wel moeten werken

ik heb het getest doormiddel van if's
ik werkt met timestamps

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?

$seriese_begindatum = 10;
$seriese_einddatum = 15;
$datum_begin = 16;
$datum_einde = 17;

    if($seriese_begindatum > $datum_begin)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_einddatum > $datum_begin)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_begindatum > $datum_einde)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_einddatum > $datum_einde)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    echo "<BR>";
    echo "<BR>";


    if($seriese_begindatum < $datum_begin)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_einddatum < $datum_begin)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_begindatum < $datum_einde)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_einddatum < $datum_einde)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }

?>


volgend dir princiepe zou het moeten werken maar ik krijg het niet voor elkaar als mysql querie

[ Voor 14% gewijzigd door InfoTracer op 22-12-2005 23:55 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Ik heb geen idee wat er nu eigenlijk in je database staat en wat je nu eigenlijk wil selecteren...kun je iets duidelijker uitleggen wat je probeert te doen en wat er hier misgaat? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
Ik probeer een zoek functie te maken voor een fotogallerij
het gaat hier om 3 tabbellen
fotograaf
die heeft
series
en serie
heeft
foto's

nu wil ik de foto's uit de database halen doormiddel van zoeken op beschikbaarheid van datum die vermeld staat bij de serie.

dus onder serie staat se_begindatum en se_einddatum

nu wil ik dat als er bij het zoeken een begin en eind datum wordt ingevult waneer die serie beschikbaar moet zijn dat ie dan die foto's laat zien die in die serie(s) zitten

maar de querie wil niet echt lukken want zoals ie nu is geeft ie alle foto's zo'n 20 keer weer

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
WHERE `se_begindatum` >= '$begindatum' AND `se_einddatum` < '$einddatum'

..is het zo simpel of begrijp ik het nog steeds niet?

trouwens is je manier van joinen vrij langzaam, je hebt vast van elke foto wel een auteur, en als elke foto in een serie zit kan je rustig inner joins gebruiken, dat is sowieso al een stuk sneller

[ Voor 50% gewijzigd door BasieP op 23-12-2005 00:28 ]

This message was sent on 100% recyclable electrons.


  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
hij mag just niet tussen die datumw vallen die in de DB staan. Want dan is die NIET beschikbaar.

Dus de datums in de database zijn de datum waneer ze NIET beschikbaar zijn

en ik wil graag weten als ze de begin en eind datum opgeven welke er dan wel beschikbaar zijn

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

BasieP schreef op vrijdag 23 december 2005 @ 00:27:
trouwens is je manier van joinen vrij langzaam, je hebt vast van elke foto wel een auteur, en als elke foto in een serie zit kan je rustig inner joins gebruiken, dat is sowieso al een stuk sneller
Langzaam? Hij gebruikt gewoon inner joins hoor, alleen zijn het impliciete inner joins in plaats van expliciete. Dat moet verder voor de snelheid niet uitmaken.

@InfoTracer:
SQL:
1
2
3
...
WHERE (NOT ingevoerdebegindatum BETWEEN `begindatum` AND `einddatum`)
  AND (NOT ingevoerdeeinddatum BETWEEN `begindatum` AND `einddatum`)

Je krijgt dan alle records terug die niet overlappen. Tijden die wèl beschikbaar zijn zul je in een aparte query moeten ophalen. (Wat er dan op neerkomt dat je de tijden ophaalt waarin ie niet beschikbaar is, en dat dan in je applicatie omdraait.)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
InfoTracer schreef op vrijdag 23 december 2005 @ 00:30:
hij mag just niet tussen die datumw vallen die in de DB staan. Want dan is die NIET beschikbaar.

Dus de datums in de database zijn de datum waneer ze NIET beschikbaar zijn

en ik wil graag weten als ze de begin en eind datum opgeven welke er dan wel beschikbaar zijn
op die fiets..
dan word het dus:

aangenomen dat je al een check heb die zorgt dat einddatum groter is dan begindatum:
WHERE `se_begindatum` < '$datum_eind' OR `se_einddatum` > '$datum_begin'
Langzaam? Hij gebruikt gewoon inner joins hoor, alleen zijn het impliciete inner joins in plaats van expliciete. Dat moet verder voor de snelheid niet uitmaken.
helaas maken niet alle databases inner joins van de oude join methode.
MySQL met MyISAM iig al niet
wij hadden op school een sql migratie, en door de joins van oude methode naar nieuwe inners te gooien duurde onze migratie zo'n 10 minuten korter

[ Voor 29% gewijzigd door BasieP op 23-12-2005 00:38 ]

This message was sent on 100% recyclable electrons.


  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
BasieP schreef op vrijdag 23 december 2005 @ 00:36:
[...]


op die fiets..
dan word het dus:

aangenomen dat je al een check heb die zorgt dat einddatum groter is dan begindatum:
WHERE `se_begindatum` < '$datum_eind' OR `se_einddatum` > '$datum_begin'


[...]
helaas maken niet alle databases inner joins van de oude join methode.
MySQL met MyISAM iig al niet
wij hadden op school een sql migratie, en door de joins van oude methode naar nieuwe inners te gooien duurde onze migratie zo'n 10 minuten korter
hmm volgens mij gaat dit niet werken

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?

$seriese_begindatum = 10;
$seriese_einddatum = 15;
$datum_begin = 14;
$datum_einde = 17;

    if($seriese_begindatum < $datum_einde )
    {
        echo "1";
    }
    else
    {
        echo "0";
    }
    if($seriese_einddatum > $datum_begin)
    {
        echo "1";
    }
    else
    {
        echo "0";
    }


hier komt 1 1 uit dus dan zou het moeten kunnen maar het kan niet want $datum_begin valt tussen $seriese_begindatum en $seriese_einddatum.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
InfoTracer schreef op vrijdag 23 december 2005 @ 00:48:
[...]


hmm volgens mij gaat dit niet werken
[...]

hier komt 1 1 uit dus dan zou het moeten kunnen maar het kan niet want $datum_begin valt tussen $seriese_begindatum en $seriese_einddatum.
mja je hebt gelijk, er moet nog wat bij, maareuh, je begrijpt het concept toch? dit kan je volgens mij ook wel zelf..

This message was sent on 100% recyclable electrons.


  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
BasieP schreef op vrijdag 23 december 2005 @ 00:52:
[...]


mja je hebt gelijk, er moet nog wat bij, maareuh, je begrijpt het concept toch? dit kan je volgens mij ook wel zelf..
uhh heb er blijkbaar nogal wat moeite mee (vandaar dat ik het hier vraag ;) )
maar met if's lukt het wel zoals je ziet in me voorbeeld code maar het wil niet echt werken in me querie

ben nu ff die van -NMe- aan het uit proberen

  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 21-04 14:16
na weer veel gepiel is he eindelijk gelukt :D

('$datum_begin' NOT BETWEEN serie.se_begindatum AND serie.se_einddatum)
('$datum_einde' NOT BETWEEN serie.se_begindatum AND serie.se_einddatum)

dus de $var en de NOT omgewisseld zodat er komt te staan NOT BETWEEN

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Die volgorde gaat bij mij altijd fout. :+

Overigens neem ik aan dat je er wel nog AND tussen hebt staan, maar dat lijkt me wel aangezien het werkt. Mooi. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1