Avatar billede Slettet bruger
04. april 2005 - 11:00 Der er 20 kommentarer og
2 løsninger

Udtræk af data fra 3 tabeller

Jeg har behov for at lave et udtræk af data fra én tabel, baseret på kriterier fra 2 andre tabeller.

Jeg har 3 tabeller...
b91_kampinf
- indeholder oplysninger om kampe (spillested, dato og den slags)

b91_kampe
- indeholder kampnr og spillernr, der viser hvilke kampe en spiller har været med i.

b91_medlemmer
- indeholder spilleroplysninger (navn, adr og den slags).

Feltet kampnr. binde de 3 tabeller sammen.

Jeg vil gerne lave et udtræk af spillere der opfylder visse kriterier:
Hent alle de spillere der har spillet en kamp indefor 1000000000 og 1999999999 (begge er unix-timestamps).

Altså noget lignende:
    $sql = ("SELECT spillernr,navn FROM b91_medlemmer,b91_kampe, b91_kampinf
            WHERE b91_kampe.kampnr=b91_kampinf.kampnr
            AND b91_medlemmer.spillernr=b91_kampe.spillernr
            AND $start<b91_kampinf.tidspunkt
            AND $slut>b91_kampinf.tidspunkt
            ORDER BY navn ASC");

Er det helt hen i vejret det jeg forsøger?
Er jeg i gang med at lægge serveren død?

Håber på noget hjælp.
Avatar billede arne_v Ekspert
04. april 2005 - 11:02 #1
Umiddelbart ser det OK ud.

Virker det ikke ?
Avatar billede fennec Nybegynder
04. april 2005 - 11:05 #2
Der mangler lige en FROM del:

.. FROM spillernr, b91_medlemmer, b91_kampinf ...
Avatar billede Slettet bruger
04. april 2005 - 11:05 #3
Får følgende fejl:
Column: 'spillernr' in field list is ambiguous
Avatar billede Slettet bruger
04. april 2005 - 11:06 #4
Dooh, vent lige 2 sekunder, det kan selvfølgelig være efterfølgende kodning, tænkte ikke lige på at spillernr pludselig ikke er entydigt længere...

Checker lige.

fennec...> Ikke forstået...
Avatar billede arne_v Ekspert
04. april 2005 - 11:08 #5
SELECT b91_medlemmer.spillernr AS spnr, ...
Avatar billede Slettet bruger
04. april 2005 - 11:10 #6
Jeg bruger en while-sætning til at hente alle poster.

Er det ikke lige så korrekt at bruge:
$row_medlemmer[b91_medlemmer.spillernr];
Avatar billede barklund Nybegynder
04. april 2005 - 11:11 #7
Nej, du skal i din SQL navngive kolonnen unikt - som arne_v siger - så henter du den ud som $row_medlemmer['spnr'];
Avatar billede Slettet bruger
04. april 2005 - 11:12 #8
arne_v...> Nu har jeg insat b91_medlemmer.spillernr i min kode, så den ser sålede ud:

    $sql = ("SELECT b91_medlemmer.spillernr,b91_medlemmer.navn FROM b91_medlemmer,b91_kampe, b91_kampinf
            WHERE b91_kampe.kampnr=b91_kampinf.kampnr
            AND b91_medlemmer.spillernr=b91_kampe.spillernr
            AND $start<b91_kampinf.tidspunkt
            AND $slut>b91_kampinf.tidspunkt
            ORDER BY navn ASC");

Nu får jeg ikke fejl, men heller ingen output.

Her er lige et større udsnit af kodningen:

    aabn_sql_og_vaelg_db();

    $start = $season_interval['start'];
    $slut  = $season_interval['slut'];


    $sql = ("SELECT b91_medlemmer.spillernr,b91_medlemmer.navn FROM b91_medlemmer,b91_kampe, b91_kampinf
            WHERE b91_kampe.kampnr=b91_kampinf.kampnr
            AND b91_medlemmer.spillernr=b91_kampe.spillernr
            AND $start<b91_kampinf.tidspunkt
            AND $slut>b91_kampinf.tidspunkt
            ORDER BY navn ASC");

    $query_medlemmer = mysql_query($sql) or die (mysql_error());

    luk_sqlforbindelse();

    $antal_medlemmer = mysql_num_rows($query_medlemmer);

    if ($antal_medlemmer>0)
      {
        $i = 0;
        while ($row_medlemmer = mysql_fetch_assoc($query_medlemmer))
          {
            $spillernr[$i] = $row_medlemmer[b91_medlemmer.spillernr];
            $navn[$i]      = $row_medlemmer[b91_medlemmer.navn];
          }
Avatar billede fennec Nybegynder
04. april 2005 - 11:14 #9
Min fejl :o)
Du har FROM med, det er mig der ikke så det...
Avatar billede barklund Nybegynder
04. april 2005 - 11:20 #10
Du skal kun bruge navnet på attributten (og ikke tabellen) når du hiver ud - og alle indekser i associative arrays er strenge:

        while ($row_medlemmer = mysql_fetch_assoc($query_medlemmer))
          {
            $spillernr[$i] = $row_medlemmer['spillernr'];
            $navn[$i]      = $row_medlemmer['navn'];
          }

--
Morten Barklund
Avatar billede Slettet bruger
04. april 2005 - 11:22 #11
Har nu rettet til følgende:

    $sql = ("SELECT b91_medlemmer.spillernr AS spillernr,b91_medlemmer.navn AS navn FROM b91_medlemmer,b91_kampe, b91_kampinf
            WHERE b91_kampe.kampnr=b91_kampinf.kampnr
            AND b91_medlemmer.spillernr=b91_kampe.spillernr
            AND $start<b91_kampinf.tidspunkt
            AND $slut>b91_kampinf.tidspunkt
            ORDER BY navn ASC");

    $query_medlemmer = mysql_query($sql) or die (mysql_error());

    luk_sqlforbindelse();

    $antal_medlemmer = mysql_num_rows($query_medlemmer);

    if ($antal_medlemmer>0)
      {
        $i = 0;
        while ($row_medlemmer = mysql_fetch_assoc($query_medlemmer))
          {
            $spillernr[$i] = $row_medlemmer['spillernr'];
            $navn[$i]      = $row_medlemmer['navn'];
          }
Avatar billede Slettet bruger
04. april 2005 - 11:26 #12
Har fundet fejlen vedr. at der ikke blev fundet data. Der var en fejl i den funktion der danner $start og $slut.

Nu får jeg masser af spillere, desværre så er hver spiller der x antal gange, afhængig af hvor mange kampe vedkommende har spillet.
Avatar billede Slettet bruger
04. april 2005 - 11:28 #13
Brugte DISTINCT... Er ikke hel haj til det her ;o)
Avatar billede barklund Nybegynder
04. april 2005 - 11:29 #14
Så kan du skrive DISTINCT lige efter SELECT - så vil hver (spiller,navn) kun komme én gang.
Avatar billede Slettet bruger
04. april 2005 - 11:29 #15
arne_v og barklund...> Takker for hjælpen.

Er en pointdeling retfærdig?
Avatar billede barklund Nybegynder
04. april 2005 - 11:30 #16
Kast bare størstedelen efter arne_v. Han er lidt bedre til det her end mig - og ikke mindst hurtigere :)
Avatar billede Slettet bruger
04. april 2005 - 11:33 #17
Er det helt hen i vejret det jeg har gang i her?

Tænker på om jeg belaster serveren voldsomt på denne her måde?

Jeg har alle disse databaser, og oprindelig var planen at de skulle nulstilles ved hver sæsonstart, men vi har besluttet at lave et arkiv, så vi kan se tidligere sæsoner.

Da der er 10 tabeller til en sæson, har vi valgt at bruge kampdatoen som omdrejningspunkt for hvad der skal vises for en sæson, og så ellers bare fylde i hver tabel.
Det vil blive helt umuligt at styre, hvis jeg lavede nye tabeller til hver sæson.
Avatar billede arne_v Ekspert
04. april 2005 - 11:44 #18
svar
Avatar billede arne_v Ekspert
04. april 2005 - 11:46 #19
nej - det er helt normalt at joine nogle tabeller - join af 3 tabeller
plus 2 yderligere where conditions er absolut ikke slemt
Avatar billede barklund Nybegynder
04. april 2005 - 11:51 #20
Og at lave tabeller til hver sæson ville være fjollet og imod en sædvanlig RDBMS/SQL-tankegang :)

Så det virker ganske fornuftigt og laver ikke umiddelbart stort belastning.

--
Morten Barklund
Avatar billede Slettet bruger
04. april 2005 - 11:58 #21
Takker endnu en gang mange gange for hjælpen :o)
Avatar billede barklund Nybegynder
04. april 2005 - 11:59 #22
Tark for points :)
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