07. december 2003 - 13:23Der er
37 kommentarer og 1 løsning
SQL-udtræk fra 2 tabeller
Jeg har 2 tabeller
Tabellen kampe: Felt SPILLERNR Felt KAMPNR
Tabellen kampinf: Felt KAMPNR Felt DATO (Og en masse andre felter).
Hvordan laver jeg et udtræk af disse 2 tabeller, sorteret efter dato, så jeg kan liste alle kampe et bestemt spillernr har været med i, sorteret efter dato?
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
a og b kan være hvad som helst. De fortæller bare til hvilke tabeller, de respektive felter hører til. Så sætter man a.felt = b.felt for at lave en "join", så man på denne måde kæder tabellerne sammen.
ja, og bagefter skriver du a.feltnavn eller b.feltnavn. I princippet behøver du kun sætte a. eller b. foran i tilflde af at feltnavnet optræder i begge tabeller (i dit tilfælde, kampnr), men jeg plejer at sætte det på alle, når jeg laver joins. Det gør det meget nemmere at overskue, specielt når SQL-sætningen bliver meget lang.
Synes godt om
Slettet bruger
07. december 2003 - 13:57#10
Hmm.... det der forvirrer mig er eks. a.kampe... Er det så en fejl fra din side?
Og hvad med FROM kampe a, kampinf b???
Synes godt om
Slettet bruger
07. december 2003 - 14:01#11
sandbox..> Dvs at a og b bruges i koden, for at slippe for at skrive tabelnavnet konstant??
ahhh, der tillod jeg mig at definere hvilke felter der skulle udtrækkes (dvs hvilke felter du får fremvist), der valgte jeg kampnr og dato. Spillernr er ligeglydig, idet der bare vil står samme nummer hele vejen ned i tabellen. Grunden til at jeg skriver a.kampnr er at kampnr findes i begge tabeller, jeg kunne ligeså godt skrive b.kampnr.
FROM kampe a, kampinf b: DVS vi henter data fra tabellen "kampe" og kalder den for "a" og henter fra "kampinf" og den for "b".
du SKAL definere dine tabeller. I princippet kan du gøre således: FROM kampinf AS kampinf, kampe AS kampe
og nedenfor skrive:
WHERE kampinf.kampnr = kampe.kampnr
Giver det bedre mening?
Synes godt om
Slettet bruger
07. december 2003 - 14:10#14
Lige nu ser min kode sådan her ud:
$spillernr = 215;
$query_kampe = mysql_query("SELECT b91_kampe.kampnr, b91_kampinf.* FROM b91_kampe AS b91_kampe, b91_kampinf AS b91_kampinf WHERE b91_kampe.kampnr = b91_kampinf.kampnr AND b91_kampe.spillernr = $spillernr AND ORDER BY b91_kampinf.dato"); while ($row_kampe = mysql_fetch_array($query_kampe)) { echo $row_kampe['b91_kampe.kampnr']; echo "---"; echo $row_kampe['b91_kampinf.dato']; echo "<br>"; }
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /web/www.kfweb.dk/www/b91randers/sider/spillerinfo.php on line 95
jeg plejer at bruge " i stedet for ', så echo $row_kampe['b91_kampe.kampnr']; bliver til echo $row_kampe["b91_kampe.kampnr"];
Synes godt om
Slettet bruger
07. december 2003 - 14:22#22
Fjernede AND fra ORDER BY-sætningen. Så fik jeg ikke fejlen mere....
Nu får jeg seks linjer med "---"
Det mystiske er at b91_kampinf-tabellen indeholder 5 kampe (for alle spillere). Det spillernr. jeg gerne vil se kampene for i det her tilfælde, har været med i 3 kampe.
bee12-> Uanset om jeg bruger " eller ', er resultatet det samme...
Synes godt om
Slettet bruger
07. december 2003 - 14:28#23
Ved at bruge: echo $row_kampe['kampnr']; i stedet for echo $row_kampe['b91_kampe.kampnr']; og echo $row_kampe['dato']; i stedet for echo $row_kampe['b91_kampinf.dato'];
får jeg nu de 3 kampe spilleren har været med i, de bliver bare printet på skærmen 2 gange?
Synes godt om
Slettet bruger
07. december 2003 - 14:33#24
Nu ser koden således sådan her ud:
$spillernr = 15; $query_kampe = mysql_query("SELECT b91_kampe.kampnr, b91_kampinf.* FROM b91_kampe, b91_kampinf WHERE b91_kampe.kampnr = b91_kampinf.kampnr AND b91_kampe.spillernr = $spillernr ORDER BY b91_kampinf.dato");
Der er en lille detalje ved funktionen mysql_fetch_array() er, at den leverer dobbelt så meget, som man normalt har brug for.
Den giver nemlig resultatet både som et navnebaseret array og et nummerbaseret.
I dit tilfælde er indholdet af $row_kampe['kampnr'] det samme som $row_kampe[0] og $row_kampe['dato'] er det samme som $row_kampe[1]. Det kan muligvis have en betydning for performance og hukommelsesforbrug, at den skal lave lidt dobbeltarbejde her.
I stedet kan man bruge funktionen mysql_fetch_assoc(), som kun henter det navnebaserede array eller mysql_fetch_row(), som henter det nummerbaserede.
Synes godt om
Slettet bruger
07. december 2003 - 19:57#36
sandbox...> Da jeg er nybegynder, er det kanon at lære at lave tingene rigtig med det samme. Der er jo ingen grund til at bruge flere ressourcer, end der er nødvendigt, så jeg takker for oplysningen :o)
Hvis man laver et udtræk af to tabeller, og gerne ville kunne adressere to felter med samme navn, nu når de er i hver sin tabel? (kig evt. på noget af ovenstående)???
Synes godt om
Slettet bruger
07. december 2003 - 21:24#37
Hvis du mener ligesom du spurgte om 07/12-2003 14:51:58, så har beef12 fuldstændig ret. I de resultater, du får ud, vil kampnr fra den ene tabel altid være det samme som kampnr i den anden tabel. Det er jo det, den får besked på i WHERE-delen af dit databaseopslag.
Men, hvis du nu har lavet to tabeller, der har hvert et felt med samme navn, og det ikke er dette felt, der sammenkobler tabellerne, så kan det også løses. Forestil dig en stor virksomhed med afdelinger i flere byer. Deres database indeholder nok noget i stil med:
MEDARBEJDERTABEL ------------------ medarbejdernr navn gade postnr afdelingsnr
Hvis de nu vil lave en side med oplysninger om en ansat, kunne de gøre således:
SELECT medarbejdernr, m.gade AS ansatgade, m.postnr AS ansatpostnr, m.afdelingsnr AS afdnr, a.gade AS afdgade, a.postnr AS afdpostnr FROM medarbejdere AS m, afdelinger AS a WHERE medarbejdernr = 5 AND m.afdelingsnr = a.afdelingsnr
Nu kan man i PHP bruge $datavariabel['ansatpostnr'] og $datavariabel['afdpostnr'] selv om de havde samme navn i tabellerne. Til gengæld er det ligegyldigt hvilken af tabellerne, jeg tager afdelingsnummeret fra.
Synes godt om
Slettet bruger
08. december 2003 - 09:03#38
sandbox....> Kanon, det var lige noget i den retning jeg tænkte på. Det ender da med jeg kan få 'skidtet' til at virke *g*
Synes godt om
Ny brugerNybegynder
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.