Avatar billede thorus Nybegynder
01. marts 2004 - 15:55 Der er 21 kommentarer og
1 løsning

Søgning Mellem flere kriterier

Jeg er igang emd et script som skal kunne søge mellem flere kriterier.

På søge siden har jeg

Dato1 & Dato2 som man skal udfylde

i mysql databasen er der en masse rows i en tabel i hver row er
der en fra periode og en til periode (det er rejser)

jeg har prøvet med:
// AND (fra_dato >= '$aar1-$md1-$dag1') AND ('$aar2-$md2-$dag2' <= fra_dato)
// AND (til_dato >= '$aar1-$md1-$dag1') AND ('$aar2-$md2-$dag2' <= til_dato)

kan man bruge BETWEEN?
Avatar billede rasmusbg Nybegynder
01. marts 2004 - 16:00 #1
Jeps, det kan man...
Avatar billede thorus Nybegynder
01. marts 2004 - 17:45 #2
Hvordan? så...
Avatar billede rasmusbg Nybegynder
01. marts 2004 - 17:57 #3
WHERE $fra_dato BETWEEN dato1 and dato2
Avatar billede thorus Nybegynder
01. marts 2004 - 18:09 #4
har prøvede:

fra_dato BETWEEN '$aar1-$md1-$dag1' AND  '$aar2-$md2-$dag2' AND til_dato BETWEEN '$aar1-$md1-$dag1' AND '$aar2-$md2-$dag2'
Avatar billede rasmusbg Nybegynder
01. marts 2004 - 18:14 #5
Måske kan et par parenteser gøre underværker? Det er et forsøg værd, og så skal rækkefølgen være $md-$dag-$aar, hvis det er DATETIME du bruger :o) Det kom jeg til at bemærke...
(fra_dato BETWEEN '$aar1-$md1-$dag1' AND  '$aar2-$md2-$dag2') AND (til_dato BETWEEN '$aar1-$md1-$dag1' AND '$aar2-$md2-$dag2')
Avatar billede thorus Nybegynder
01. marts 2004 - 19:34 #6
Det virker ikke:

der er test db'en:

CREATE TABLE pakkerejse (
  id int(11) NOT NULL auto_increment,
  fra_dato date NOT NULL default '0000-00-00',
  til_dato date NOT NULL default '0000-00-00',
  pakkepris int(11) NOT NULL default '0',
  pakken text NOT NULL,
  hotel int(11) NOT NULL default '0',
  personer varchar(30) NOT NULL default '',
  land int(11) NOT NULL default '0',
  verified tinyint(4) NOT NULL default '1',
  Destination int(11) NOT NULL default '0',
  dage varchar(20) NOT NULL default '',
  tilbud varchar(10) NOT NULL default '0',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

INSERT INTO pakkerejse VALUES (33, '2004-01-01', '2004-12-09', 9998, '', 501, '', 30, 1, 372, '19', '');
INSERT INTO pakkerejse VALUES (28, '2004-01-01', '2004-05-01', 11798, '', 433, '', 29, 1, 102, '17', '');
INSERT INTO pakkerejse VALUES (30, '2004-01-01', '2004-12-09', 9998, ' .', 500, '', 25, 1, 358, '19', 'checkbox');
INSERT INTO pakkerejse VALUES (32, '2004-01-01', '2004-12-09', 9998, ' \n\ .', 499, '', 25, 1, 357, '19', '');
INSERT INTO pakkerejse VALUES (34, '2004-04-20', '2004-06-10', 5555, ' . ', 345, '', 25, 1, 302, '10', 'checkbox');
INSERT INTO pakkerejse VALUES (37, '2004-03-12', '2004-04-09', 9998, ' – Fra kr. 500', 430, '', 1, 1, 105, '17', '');


Det som skal være muligt at at hver pakkerejse har en periode som den køre i. og i søgningen skal det være muligt at sige eks.  jeg vil godt finde en pakkerejse mellem 01-03-2004 - 08-04-2004
Avatar billede rasmusbg Nybegynder
01. marts 2004 - 20:30 #7
Jeg skal lige høre: Kommer databasen med en fejl, eller får du bare ikke nogen rækker?
Avatar billede thorus Nybegynder
01. marts 2004 - 20:45 #8
den kommer bare ikke med alle udtræk som jeg ved ligger inden for det søgte
Avatar billede rasmusbg Nybegynder
02. marts 2004 - 01:50 #9
Jeg har prøvet at køre følgende query på dit eksempel med samme skema og testdata:

SELECT *
FROM pakkerejse
WHERE (fra_dato BETWEEN '2004-01-03' AND  '2004-08-04')
AND
(til_dato BETWEEN '2004-01-03' AND  '2004-08-04')

Det denne query returnerer er disse to tupler:

(34, '2004-04-20', '2004-06-10', 5555, ' . ', 345, '', 25, 1, 302, '10', 'checkbox')
(37, '2004-03-12', '2004-04-09', 9998, ' – Fra kr. 500', 430, '', 1, 1, 105, '17', '')

Jeg har bagefter prøvet at undersøge, hvad query'en skulle returnere, og det er præcist de to tupler, den skal returnere.
Hvis du vil have alle de pakkerejser ud, hvor dato1 og dato2 ligger imellem fra_dato og til_dato, så skal din query se sådan ud:

SELECT *
FROM pakkerejse
WHERE ('2004-01-03' BETWEEN fra_dato AND til_dato)
AND
('2004-08-04' BETWEEN fra_dato AND til_dato)
Avatar billede thorus Nybegynder
02. marts 2004 - 12:26 #10
Det virker stadig ikke...

hvis jeg skriver:

fra dato: 2004-05-28
til dato: 2004-06-10

så skulle den kunne finde:

2004-04-30 2004-05-28 7598 
2004-06-04 2004-06-04 8498

men det kan den ikke. hvad gør jeg galt?
Avatar billede thorus Nybegynder
02. marts 2004 - 14:04 #11
Det som jeg er ude efter er at den ene bare skal være sand. jeg har prøvet med:

SELECT *
FROM pakkerejse
WHERE ('2004-01-03' BETWEEN fra_dato AND til_dato)
OR
('2004-08-04' BETWEEN fra_dato AND til_dato)

men det virker ikke. nogen forslag?
Avatar billede thorus Nybegynder
02. marts 2004 - 14:06 #12
giver gerne 100 extra point til den som kommer med en løsning.
Avatar billede rasmusbg Nybegynder
02. marts 2004 - 14:48 #13
Jeg skal lige være sikker på, at jeg har forstået korrekt, hvad det er du vil finde ud af...
Du vil gerne finde alle de pakkerejser, hvor de indtastede datoer ligger indenfor pakkerejsernes interval, ikke?
Avatar billede thorus Nybegynder
02. marts 2004 - 14:52 #14
bare fra_dato eller til_dato skal ligge inden for perioden:

hvis jeg skriver:

fra dato: 2004-05-28
til dato: 2004-06-10

eks.
så skulle den kunne finde:

Periodefra      Periodetil
2004-04-30  2004-05-28 7598
2004-06-04  2004-06-04 8498
Avatar billede rasmusbg Nybegynder
02. marts 2004 - 14:59 #15
Denne query:

SELECT *
FROM pakkerejse
WHERE ('2004-05-28' BETWEEN fra_dato AND til_dato)
OR
('2004-06-10' BETWEEN fra_dato AND til_dato)

giver følgende resultat:

(33, '2004-01-01', '2004-12-09', 9998, '', 501, '', 30, 1, 372, '19', '')
(30, '2004-01-01', '2004-12-09', 9998, ' .', 500, '', 25, 1, 358, '19', 'checkbox')
(32, '2004-01-01', '2004-12-09', 9998, ' \n\ .', 499, '', 25, 1, 357, '19', '')
(34, '2004-04-20', '2004-06-10', 5555, ' . ', 345, '', 25, 1, 302, '10', 'checkbox')

Jeg har prøvet at køre den i Query Analyzer'en.
Avatar billede rasmusbg Nybegynder
02. marts 2004 - 15:01 #16
Du er tilsyneladende begyndt at bruge andre data at teste på...jeg har dem, du har givet i din kommentar fra 01/03-2004 19:34:17
Avatar billede thorus Nybegynder
02. marts 2004 - 15:19 #17
ja men det skulle ikke have nogen forskel.

hvis jeg har flere AND i select stat. kan de så godt komme bagefter OR ?
Avatar billede thorus Nybegynder
02. marts 2004 - 15:21 #18
eks:

SELECT *
FROM pakkerejse
WHERE verified = '1' AND ('2004-05-28' BETWEEN fra_dato AND til_dato)
OR
('2004-06-10' BETWEEN fra_dato AND til_dato) AND (hotel = 'hotel1') AND etc..
Avatar billede rasmusbg Nybegynder
02. marts 2004 - 15:26 #19
Ja, det kan du sagtens, men du skal bare for din egen skyld sørge for at sætte parenteser omkring de udsagn, der skal evalueres sammen. F.eks.

(1 = 1 AND 2 = 2) OR ((3 = 3 AND 4 = 4) AND 5 = 5)

Så er du nemlig ikke i tvivl om hvilken rækkefølge udsagnene bliver evalueret i.
Avatar billede thorus Nybegynder
02. marts 2004 - 15:36 #20
når jeg laver den her:

{
$DATOEN = "AND (('$aar1-$md1-$dag1' BETWEEN fra_dato AND til_dato) OR ('$aar2-$md2-$dag2' BETWEEN fra_dato AND til_dato))";
}

så tager den ikke datoer imellem datoerne, hvordan kan det være?

kan det være noget med det her?
$kriterie = mysql_query("SELECT id, date_format(fra_dato, '%d.%m.%Y') as fra_dato, date_format(til_dato, '%d.%m.%Y') as til_dato, pakkepris, pakken, hotel, personer, land, verified, Destination, dage FROM pakkerejse

WHERE
verified = 1
$LAND
$DES
$PRISEN
$RES
$DATOEN

order by pakkepris desc LIMIT 200");
Avatar billede thorus Nybegynder
02. marts 2004 - 15:38 #21
det er mærkeligt det her. probæemet opstår kun når der er en periode som eks.
04.06.2004 -> 04.06.2004

så bliver den kun talt med hvis det er dato 1 eller 2 ...
Avatar billede thorus Nybegynder
05. marts 2004 - 11:37 #22
har funder en løsning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester