Avatar billede Slettet bruger
06. maj 2018 - 01:43 Der er 5 kommentarer

Hjælp til SQL

Hej,

Jeg har i en database en række personer der hver især er tilknyttet et eller flere hold. Hvert hold har nogle forskellige træningsdatoer.

Jeg ønsker at kunne finde ud af hvor mange gange en given person har deltaget i træning på hvert enkelt hold vedkommende er tilknyttet. Man skal også kunne se hvor mange gange vedkommende har deltaget ud af antal mulige gange (altså fx 5 ud af 9 gange).

Nedenstående er min database-struktur.

tbl_medlem:
1    id    int(11)
2    fornavn    varchar(50)
3    efternavn    varchar(50)
4    dob    datetime

tbl_hold:
1    id    int(11)
2    Navn    varchar(255)

tbl_traeninger:
1    id    int(11)
2    date    date
3    hold_id    int(11)

tbl_map_mellem_hold:
1    id    int(11)
2    medlem_id    int(11)
3    hold_id    int(11)

tbl_map_mellem_traeninger:
1    id    int(11)
2    medlem_id    int(11)
3    training_id    int(11)

Jeg håber der er en venlig person derude der kan hjælpe mig med noget fungerende SQL, samt visning via PHP.
Avatar billede arne_v Ekspert
06. maj 2018 - 02:01 #1
Proev:

SELECT tbl_hold.navn, COUNT(*)
FROM tbl_medlem
JOIN tbl_map_mellem_hold ON tbl_medlem.id = tbl_map_mellem_hold.medlem_id
JOIN tbl_hold ON tbl_hold.id = tbl_map_mellem_hold.hold_id
JOIN tbl_traeninger ON tbl_traeninger.hold_id = tbl_hold.id
JOIN tbl_map_mellem_traeninger ON tbl_map_mellem_traeninger.medlem_id = tbl_medlem.id AND tbl_map_mellem_traeninger.training_id = tbl_traeninger.id
WHERE tbl_medlem.id = ?
GROUP BY tbl_hold.navn
Avatar billede arne_v Ekspert
06. maj 2018 - 02:03 #2
Og:

SELECT tbl_hold.navn, COUNT(*)
FROM tbl_hold
JOIN tbl_traeninger ON tbl_traeninger.hold_id = tbl_hold.id
GROUP BY tbl_hold.navn
Avatar billede Slettet bruger
06. maj 2018 - 02:07 #3
Tak for det, arne_v! Det virker :-)
Jeg havde dog skrevet forkert i mit opslag (der er ikke noget der hedder "mellem", men derimod "medlem" i tabelnavnene).

Har du mulighed for at hjælpe med at med noget PHP-visning også?
Avatar billede olsensweb.dk Ekspert
07. maj 2018 - 09:23 #4
>Jeg havde dog skrevet forkert i mit opslag (der er ikke noget der hedder "mellem", men derimod "medlem" i tabelnavnene).
derfor er et sql dump ofte meget bedre, gerne med test data, så man kan afprøve sql før den postes herinde.

>Har du mulighed for at hjælpe med at med noget PHP-visning også?
du har jo allerede coden, hvis du kigge i et af dine  tidligere spm
ref https://www.computerworld.dk/eksperten/spm/1023454
<?php
$sql = "SELECT * FROM tbl_medlem WHERE id = ".$_GET['id'];
$result = $conn->query($sql);

if ($result->num_rows > 0) {

  while($row = $result->fetch_assoc()) {
      echo $row["fornavn"];
  }
} else {
  echo "0 results";
} ?>



en forbedring ville være at bruge prepare statement
www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf
Avatar billede Slettet bruger
10. maj 2018 - 12:45 #5
Jeg har følgende lige nu:

<?php
$editId2 = $_POST['EID2'];

$sql2 = "SELECT *, COUNT(*)
          FROM tbl_medlem
          JOIN tbl_map_medlem_hold ON tbl_medlem.id = tbl_map_medlem_hold.medlem_id
          JOIN tbl_hold ON tbl_hold.id = tbl_map_medlem_hold.hold_id
          JOIN tbl_traeninger ON tbl_traeninger.hold_id = tbl_hold.id
          JOIN tbl_map_medlem_traeninger ON tbl_map_medlem_traeninger.medlem_id = tbl_medlem.id AND tbl_map_medlem_traeninger.training_id = tbl_traeninger.id
          WHERE tbl_medlem.id = '$editId2'
          GROUP BY tbl_hold.navn";
         
$result2 = mysqli_query($conn,$sql2);
while($row2 = mysqli_fetch_assoc($result2)) {
  echo "<strong>". $row2['fornavn'] ."</strong>";
  }
?>

Jeg vil rigtig gerne have det vist således på min hjemmeside:

[Fornavn]
[Holdnavn]: Har deltaget i [Antal træninger] udover af [Antal mulige træninger baseret på datoerne]. Der er i alt [Samlet antal træninger].

Deltager en person på flere hold, så vil det vil være dejligt hvis ovenstående kunne gentages nedenunder for de øvrige hold.

Er der nogen der kan hjælpe med at opstille det?
På forhånd tak.
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

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