Avatar billede streak Nybegynder
05. maj 2000 - 14:04 Der er 18 kommentarer og
1 løsning

sql forspørgsel

Er der nogen af jer der kan hjælpe mig med flg.
Jeg skal skrive en forespørgsel i mysql der gør flg:
søg efter Undervisere fra et specefikt amt, der er ledig i den pågældne periode

Der er bare et mindre problem. Jeg kan ikke overskue det.
Mine tabeller ser ud som flg.:

Tabel Kalender:
Kalender_ID int(11)
UnderviserID int(11)
Dato date
Referance varchar(60)
OrgID int(11)

Tabel Undervisere:
UnderviserID int(11)
Amt_ID int(11)
Fornavn varchar(50)
samt alt det normale stamdata.

Søgningen skal som skrevet list alle de undervisere der ikke er booket fuldtud i den givne periode. Perioden bliver indtastet i en
form, der består af to felter: startdato og slutdato. Amt id kommer fra en dropdown boks der inde holder en alle amter i danmark,
der har hver sin id. Hvis i skal bruge mere info, skriv til mig !!
Avatar billede erikjacobsen Ekspert
05. maj 2000 - 14:18 #1
Nu er jeg ikke en ørn til de mere specielle ting i MySql, men jeg
kan umiddelbart løse den, ved at lave en forespørgsel om alle undervisere
i det pågældende amt, og derefter for hver af disse lave en forespørgsel på
om de har aftaler i den angivne periode, altså med yderligere et antal
forespørgsler. Er det godt nok?
Avatar billede streak Nybegynder
05. maj 2000 - 14:31 #2
jeg er ret stresset oven i knuppen lige nu, kan du ikke lige prøve at skrive det du mener i sql statements istedet for normal sprog ??
Avatar billede erikjacobsen Ekspert
05. maj 2000 - 14:36 #3
Joh, skal vi sige PHP-agtigt - men utestet.


  sql="select underviserid,fornavn from undervisere where amt_id=$amt";
  $res = mysql_query(sql);

  while ($row=mysql_fetch_row($res)) {
    sql2="select * from kalender where underviserid=$row[0] and dato>=$startdate and dato<=$slutdate";
    $res2 = mysql_query(sql2);
    if (mysql_num_rows($res2)=0) {
      ehco "$row[1] kan godt<br>":
    }
    mysql_free_result($res2);
  }

  mysql_free_result($res);
Avatar billede streak Nybegynder
05. maj 2000 - 14:51 #4
hmm...... jeg får et tomt svar .... men det ser da udemærket ud det du har lavet. Der skal dog nogle små tilrettelser til.
Avatar billede erikjacobsen Ekspert
05. maj 2000 - 15:35 #5
Yeps, der mangler enkeltstroffer rundt om '$startdate' og '$slutdate', det skal være ==0
i sammenligningen. Hmm, hvad ellers? Gider du poste din version?
Avatar billede streak Nybegynder
05. maj 2000 - 15:52 #6
Dette er som den pt. ser ud:

$sql="select UnderviserID,Fornavn from Undervisere where Amt_ID=$amt";
      $res = mysql_query($sql);
      while ($row=mysql_fetch_row($res))
      {
        $sql2="select * from Kalender where UnderviserID=$row[0] and Dato>=$startdate and
        Dato<=$slutdate";
        $res2 = mysql_query($sql2);
        $row2=mysql_fetch_row($res2);
        $total= mysql_num_rows($row2);
        while ($counter < $total)
        {
          echo "$row2[$counter] kan godt<br>";
          $counter++;
        }
      mysql_free_result($res2);
      }
      mysql_free_result($res);

Der kommer dog ikke noget resultat ud af denne søgning.
Avatar billede erikjacobsen Ekspert
05. maj 2000 - 15:56 #7
Prøv lige med strofferne omkring datoerne. Hedder dine variabler det
samme som mine? Er datoformatet korrekt?

Jeg læste forkert: jeg giver dig - i princippet - dem der kan i hele
perioden, og du vil have dem der ikke er fuldt optaget. Jeg skal løbe
nu, men vender tilbage!
Avatar billede streak Nybegynder
05. maj 2000 - 16:32 #8
Dette er som den ser ud nu:

<?
include '../include/db_init.inc';                                                                                 
mysql_connect("$site", "$username", "$password");                           
@mysql_select_db("$dbName") or die("Unable to select database");             


$sql = "select UnderviserID,Fornavn from Undervisere where Amt_ID=1";

$res = mysql_query($sql);
while ( $row = mysql_fetch_array($res) )
{
  $sql2  = "select * from Kalender where UnderviserID=11 and Dato >= '2000-01-10' and Dato <= '2000-04-08'";
  $res2  = mysql_query($sql2);
  $row2  = mysql_fetch_array($res2);
  $total = mysql_num_rows($res2);
  while ( $counter < $total )
  {
    echo $row2[$counter];
    echo " kan godt<br>";
    $counter++;
  }
  mysql_free_result($res2);
}
mysql_free_result($res);
?>

Nu skriver den 6 records ud på skærmen, og det er fint nok for mig. Jeg har dog, indtastet bruger id og til og fra dato ind i selve koden for at kunne teste det. Men som du selv skriver, så er det ikke lige det jeg skal bruge. Hvis man kan lave det hele på en gang ville det jo også være at foretrække.
Avatar billede streak Nybegynder
05. maj 2000 - 16:34 #9
Den skriver flg.

kan godt
11 kan godt
2000-02-06 kan godt
Jubilæum kan godt
kan godt
kan godt

Der er bare et lille problem...11, 2000-02-06, Jubilæum er fra den samme linie i Kalender tabellen. Weird !!
Avatar billede erikjacobsen Ekspert
05. maj 2000 - 20:46 #10
Ikke spor weird.... Det er jo det du beder den om. Lad os lige vente med det
med variablerne til det her virker. Du skal nok nærmere lave indmaden på
denne måde (du får de optagede dage ... desværre):

$sql = "select UnderviserID,Fornavn from Undervisere where Amt_ID=1";
$res = mysql_query($sql);
while ( $row = mysql_fetch_row($res) )  {
  $sql2  = "select * from Kalender where UnderviserID=$row[0] and Dato >= '2000-01-10' and Dato <= '2000-04-08'";
  $res2  = mysql_query($sql2);
  while ($row2  = mysql_fetch_row($res2)) {
      echo "$row[1] er optaget $row2[2]<br>";
  }
  mysql_free_result($res2);
}
mysql_free_result($res);

Hmm, hvordan får vi de ledige dage? Har du en tabel med de dage, der kan komme på
tale, f.eks. fraregnet lørdag, søndag helligdage? Ellers må vi til at regne på datoer.

Men altså: giver ovenstående de rigtige, men optagede, dage?
Avatar billede streak Nybegynder
05. maj 2000 - 21:59 #11
Der er kke nogen tabel med sådanne information. Den eneste tabel der er med datoer, er kalender tabellen. Jeg har fået at vide at man ikke skal tage højde for noget som helst. Det eneste krav er at den ikke lister undervisere der er fuldt booket i denne peirode. Jeg ved godt at det kan blive et problem med weekender og sådan noget. Pt. skal forespørgslen bare liste dem der er tilrådighed i den intastede periode, og liste dem i en drop downbox længere nede på siden.

Vil du gerne se hvordan det ser ud ??? Der er allered nogle søgninger der !!
Avatar billede streak Nybegynder
09. maj 2000 - 12:48 #12
Jeg har nu fået den til at gøre det hele lidt mere automatisk. Men som du også selv skrev så skal den jo kun finde de undervisere der ikke er booket 100% i den valgte periode.

Hvordan kan man lave sådan en søgning ?? Jeg ved det ikke lige... så derfor ville det da være rart med bare en smule mere hjælp.

Den nuværende kode står neden for !!

================= CUT HERE ======================

<?
include '../include/db_init.inc';                                                                   

mysql_connect("$site", "$username", "$password");                           
@mysql_select_db("$dbName") or die("Unable to select database");             
$count1=0;
$count2=0;
$aid = 3;

// Her vælges alle de Undervisere der er knyttet til det valgte amt

$sql = "select UnderviserID from Undervisere where Amt_ID='$aid' order by Amt_ID";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$total1 = mysql_num_rows($res);
$uid = $row[UnderviserID];
while( $count1 < $total1 )
  {

// Her vælges de Undervisere der matcher med UndeviserID feltet i Kalender tabellen

  $sql2  = "select UnderviserID from Kalender where Kalender.UnderviserID='$uid' and Kalender.Dato >= '2000-01-10' and Kalender.Dato <= '2000-04-08'";
  $res2  = mysql_query($sql2);
  $row2  = mysql_fetch_array($res2);
  $total2 = mysql_num_rows($res2);
  while ( $count2 < $total2 )
    {
    echo $row2[$count2];
    echo " kan godt<br>";
    $count2++;
    }
  mysql_free_result($res2);
  $count1++;
  }
mysql_free_result($res);
?>
Avatar billede erikjacobsen Ekspert
09. maj 2000 - 13:55 #13
Ok, mr. streak, we prøwer again. Denne funktion

  function days($d1,$d2) {
  if (!ereg( "^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$", $d1, $r1)) {
    echo "fejl i $d1\n";
  }
  if (!ereg( "^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$", $d2, $r2)) {
    echo "fejl i $d2\n";
  }
  $yy1=$r1[1]; $mm1=$r1[2]; $dd1=$r1[3];
  $yy2=$r2[1]; $mm2=$r2[2]; $dd2=$r2[3];
  $t1 = gmmktime(0,0,0,$mm1,$dd1,$yy1);
  $t2 = gmmktime(0,0,0,$mm2,$dd2,$yy2);

  return ($t2-$t1) / (60*60*24);
}

Giver dig antal dage mellem to datoer. Med

$antaldage = days('2000-1-1','2000-1-2');
echo $antaldage;

udskrives 1. Når du har lavet dit udtræk med $sql2, checker du om $total2<$antaldage+1
(Både startdag og slutdag skal jo med). Hvis det er tilfældet, er der ledige dage.
Øh, tror jeg nok - men du kan da prøve!
Avatar billede streak Nybegynder
09. maj 2000 - 14:12 #14
Der er ikke noget problem med de dag... det virker fint. Problemet er at få listet de brugere/undervisere der ikke er booket 100% i deres kalender, altså i Kalender tabellen. Der skal laves en mystisk ting... som jeg ikke lige forsår.
Jeg har selv ret travt pt. med at få lavet SMG nye system færdig til i morgen tidlig. Så lidt hjælp med det her er at foretrække !!
Avatar billede erikjacobsen Ekspert
09. maj 2000 - 14:19 #15
Jamen, det er jo lige det jeg har gjort. Også skåret ud i pap? Ok ;-)

$sql2  = "select UnderviserID from Kalender where Kalender.UnderviserID='$uid' and Kalender.Dato >= '2000-01-10' and Kalender.Dato <= '2000-04-08'";
  $res2  = mysql_query($sql2);
  $total2 = mysql_num_rows($res2);
  if ($total2<$antaldage+1) {
        echo "$uid kan godt<br>";
  }
  mysql_free_result($res2);
}
Avatar billede streak Nybegynder
09. maj 2000 - 14:57 #16
det ser da ud til at virke.... jeg mangler dog nogle flere test data, så jeg kan få det rigtig testet.. så jeg håber/ser frem til at det virker når der kommer noget mere materiale i databasen.

Takker mange gange.... 
Heres your points !!
Avatar billede erikjacobsen Ekspert
09. maj 2000 - 15:00 #17
Mange mange tak. Hvis der ellers er noget, er du velkommen
her på eksperten.dk igen !
Avatar billede streak Nybegynder
11. maj 2000 - 16:08 #18
Hey Erik.... jeg har lige et mindre problem.... det ser vældig godt ud det der vi har lavet. Der er bare lige et mindre problem med det. Det skal også vise de undervisere der ikke er i kalenderen. Lige nu viser den jo kun de personer der er i selve kalenderen eller sagt på en anden måde..... de der er booket, mindre en 100%. Det er fedt nok, men den mangler som sagt at vise, de undervisere der ikke har nogle planer.

Kan du hjælpe mig med det ??
Avatar billede erikjacobsen Ekspert
11. maj 2000 - 16:55 #19
Jaaaah, jamen, hvis de er i tabellen Undervisere, og de ikke har nogen dage
i Kalender, så kommer den jo tilbage med 0 rækker, og så vil den sige ok,
han kan godt. Hmm, jeg tror ikke rigtigt på det!!!
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