Avatar billede hrole Mester
14. december 2018 - 08:12 Der er 10 kommentarer

Hjælp til JOIN og php

Hej,
Jeg er ved at lave et skema og har svært ved at få udtrækket korrekt. Følgende tabeller:
bruger:
b_id-navn-adresse

kalender:
dato-ugedag-heligdag

skema:
b_id-type_id-dato-andet

vagter:
type_id-vagt_navn

Jeg ønsker at få trykket ud som:
dato-vagt_navn(1)-vagt_navn(2)-vagt_navn(3)
1.1.18-navn(1),navn(2),navn(3)-(tom)-navn(1)
2.1.18-(tom)-(tom)-navn(1)
3.1.18

Det skal forstås således at flere kan have samme vagt under fx 1.1.18 og vagt_navn(1).
Avatar billede Rune1983 Ekspert
14. december 2018 - 13:19 #1
Kan du beskrive det lidt bedre. Måske opstille det anderledes så man bedre kan se hvilket resultat du ønsker til slut.
Avatar billede hrole Mester
14. december 2018 - 15:11 #2
bruger:
b_id-navn-adresse
1-mads-gade
2-lars-vej
3-poul-østergade

kalender:
dato-ugedag-heligdag
1.1.18-mandag-nytårsdag
2.1.18-tirsdag
3.1.18-onsdag
4.1.18-torsdag
5.1.18-fredag
6.1.18-lørdag

skema:
b_id-type_id-dato-andet
1-1-1.1.18
1-1-2.1.18
2-1-1.1.18
3-2-2.1.18
2-1-6.1.18
1-4-4.1.18
3-4-4.1.18
2-3-3.1.18
2-3-3.1.18
1-1-6.1.18
2-1-6.1.18
3-1-6.1.18

vagter:
type_id-vagt_navn
1-kassevagt
2-fri
3-personalevagt
4-kursus

Ønsket resultat:
dato-ugedag-helligdag-kassevagt-personalevagt-fri-kursus
1.1.18-mandag-nytårsdag-mads, lars-[tom]-[tom]-[tom]
2.1.18-tirsdag-[tom]-mads-[tom]-poul-[tom]
3.1.18-onsdag-[tom]-[tom]-lars, poul-[tom]-[tom]
4.1.18-torsdag-[tom]-[tom]-[tom]-[tom]-mads, poul
5.1.18-fredag-[tom]-[tom]-[tom]-[tom]-[tom]
6.1.18-lørdag-[tom]-lars-[tom]-[tom]-mads, lars, poul
Avatar billede olsensweb.dk Ekspert
14. december 2018 - 22:27 #3
>dato-ugedag-helligdag-kassevagt-personalevagt-fri-kursus
dette vil give problemer

jeg tror du er nød til at lave en query pr vagt type pr dag muligvis i nogle subquery's, der kunne være flere der kunne have sammen vagt sammen dag

sql_0 henter dato-ugedag-helligdag
sql_1 henter alle kassevagt'erne, pågældende dag
sql_2 henter alle personalevagt'erne, pågældende dag
sql_3 henter alle fri'erne, pågældende dag
sql_4 henter alle kursus'erne, pågældende dag


som skrevet i https://www.computerworld.dk/eksperten/spm/1026210 #1
>dagen kan du udregne ud fra din dato<
Avatar billede hrole Mester
15. december 2018 - 10:50 #4
#3 Ok. Jeg har problemer med at få korrekt udtræk. Forsøgt først med personalevagt: SELECT * FROM kalender_2019 WHERE db_date IN (SELECT db_date FROM skema_2019 WHERE vagt_type_id = '3' ORDER BY b_id)

Kan strukturen af tabellerne forbedres?
Avatar billede olsensweb.dk Ekspert
15. december 2018 - 11:40 #5
>Forsøgt først med personalevagt:
du kan finde navne på kasse vagterne den 2018-01-01 med dette: (den jeg kaldte sql_1 i #3)
SELECT bruger.navn FROM skema
JOIN bruger ON skema.b_id = bruger.b_id
JOIN vagter on skema.type_id = vagter.type_id
WHERE vagter.type_id = 1 AND skema.dato = '2018-01-01'

ret selv dette WHERE vagter.type_id = 1 AND skema.dato = '2018-01-01' for de andre vagt typer og dato'er


>Kan strukturen af tabellerne forbedres?
tror jeg ikke
Avatar billede olsensweb.dk Ekspert
15. december 2018 - 13:41 #6
sql i #5 kan forkortes / optimeres til
SELECT bruger.navn FROM skema
JOIN bruger ON skema.b_id = bruger.b_id
WHERE skema.type_id = 1 AND skema.dato = '2018-01-01'



det er logisk for enhver der gider lave og kigge på sit E/R diagram :)
Avatar billede showsource Seniormester
15. december 2018 - 18:41 #7
Hmm, jeg ved ikke, men jeg lavede en vagtplan til en bar.

3 tabeller,
tjenere:
id, navn, farve (farve til den enkelte for at nemmere kunne se forskel)
vagttider:
id, tid, sorter (sorter for at kunne få vist tid i den rækkefølge man ville ha', 11-19, 19-03, 18-03 f.eks.)
vagtplan;
id, dato, tid_id, tjener_id

Med hensyn til helligdage lavede olsensweb.dk engang en funktion:
https://www.computerworld.dk/eksperten/spm/936923

Bruger så php til at få vist aktuel måned, + 2 frem. (links)

sql til at hente:
$vagtsql = "SELECT t1.dato as dag, t2.tid as kl, t3.navn as tj, t3.farve as color
          FROM vagtplan as t1, vagttider as t2, tjenere as t3
          WHERE t1.tid_id = t2.id AND ".(isset($_GET["tjenerref"],$tjen_ar[$_GET["tjenerref"]]) ? "t3.id = ".$_GET["tjenerref"]." AND t1.tjener_id = ".$_GET["tjenerref"] : "t1.tjener_id = t3.id")."
          AND t1.dato BETWEEN '".$startdato."' AND '".$lastdato."'
          ORDER BY t1.dato, t2.tid ASC;";

$_GET["tjenerref" er få at kun vise for den enkelte
$tjen_ar[$_GET["tjenerref"] er et array med id, navn og farve på tjener

Sgu lidt rodet at sidde og kikke gamle koder :O)
Avatar billede hrole Mester
17. december 2018 - 08:41 #8
#6 Hm, jeg kan ikke helt gennemskue den endelige løsning.

Hvis jeg bruger SELECT bruger.navn FROM skema
JOIN bruger ON skema.b_id = bruger.b_id
WHERE skema.type_id = 1

Og laver en foreach som løber datoerne igennem og herefter trækker fra databasen.
Men det bliver kun for én af vagttyperne?

#7 Tak for info. om helligdagsfunktion, det har jeg faktisk og siddet og arbejdet på.
Avatar billede olsensweb.dk Ekspert
17. december 2018 - 11:41 #9
#8
>Og laver en foreach som løber datoerne igennem og herefter trækker fra databasen.
>Men det bliver kun for én af vagttyperne?
ja.
du skal have din dato med i din query for pågældende dag.
du skal lave 5 query'es pr række
sql_1-4 er ens med undtagelse af type_id = 1-4
dette laver du for hver dato.


pseudocode

foreach dato (
sql_0 henter dato-ugedag-helligdag
sql_1 henter alle kassevagt'erne, pågældende dag
sql_2 henter alle personalevagt'erne, pågældende dag
sql_3 henter alle fri'erne, pågældende dag
sql_4 henter alle kursus'erne, pågældende dag
samler data og udskriver rækken
)



>#7 Tak for info. om helligdagsfunktion, det har jeg faktisk og siddet og arbejdet på.
vær opmærksom på at functionen har dato'en skrevet i epoc time (sekunder), og du arbejder i datetime format, så det ene af formaterne skal convateres så de bliver i sammen format, for at sammenligne (anbefaler at bruge date format), men får du den implamenteret kan du slette tabellen kalender
Avatar billede hrole Mester
17. december 2018 - 15:33 #10
Jeg får det ikke til at fungere, desværre (jeg har ændre på nogle af kolonnenavnene ift. #2)

$date = '2019-01-01';
$end_date = '2019-01-31';

while (strtotime($date) <= strtotime($end_date)) {

$qry_kal = mysqli_query($dbc, "SELECT * FROM kalender WHERE date = '$date'");

$qry_vt3 = mysqli_query($dbc, "SELECT * FROM skema
JOIN brugere ON skema.b_id = brugere.b_id
WHERE skema.vagt_type_id = 3 AND skema.dato = '$date'");

$qry_vt4 = mysqli_query($dbc, "SELECT * FROM skema
JOIN brugere ON skema.b_id = brugere.b_id
WHERE skema.vagt_type_id = 4 AND skema.dato = '$date'");

while ($row = mysqli_fetch_array($qry_kal)) { echo $row['date'].' '.$row['day_name'];}
while ($row = mysqli_fetch_array($qry_vt4)) {    echo $row['navn'];}
while ($row = mysqli_fetch_array($qry_vt3)) {    echo $row['navn'];}

$date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));

}
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