Avatar billede Slettet bruger
07. december 2003 - 13:23 Der 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?
Avatar billede skovenborg Nybegynder
07. december 2003 - 13:35 #1
du kan lige kigge på den her:
http://www.mysql.com/doc/en/Multiple_tables.html
Avatar billede beef12 Nybegynder
07. december 2003 - 13:38 #2
SELECT a.kampe, b.dato
FROM kampe a, kampinf b
WHERE a.kampnr = b.kampnr
AND a.spillernr = xx
AND ORDER BY dato;

Håber jeg forstår opgaven korrekt...
Avatar billede beef12 Nybegynder
07. december 2003 - 13:41 #3
Nej, det er vist forkert det jeg skriver nu hvor jeg lige tænker mig om.
Tror heller at du skal bruge:
AND Spillernr in xxx

eller måske bare

AND Spillernr EXISTS
Avatar billede skovenborg Nybegynder
07. december 2003 - 13:43 #4
det kan også være kfisker vil have alle dataene fra kampinf med - for så skal der jo stå:
b.* i stedet
Avatar billede Slettet bruger
07. december 2003 - 13:46 #5
Hmmm... jeg forstår ikke helt de der "a" og "b"....
Avatar billede beef12 Nybegynder
07. december 2003 - 13:49 #6
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.
Avatar billede Slettet bruger
07. december 2003 - 13:50 #7
Dvs. at jeg bruger eks. a=kampe og b=kampinf??
Avatar billede Slettet bruger
07. december 2003 - 13:52 #8
Ja. Det er det, der står i denne linie:

FROM kampe a, kampinf b

Man kunne også have skrevet

FROM kampe AS a, kampinf AS b
Avatar billede beef12 Nybegynder
07. december 2003 - 13:54 #9
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.
Avatar billede 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???
Avatar billede 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??
Avatar billede beef12 Nybegynder
07. december 2003 - 14:02 #12
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".
Avatar billede beef12 Nybegynder
07. december 2003 - 14:06 #13
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?
Avatar billede 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>";
  }

Jeg får en fejl må fetch_array'et.....
Avatar billede beef12 Nybegynder
07. december 2003 - 14:12 #15
hvad siger fejlmeddelsen?
Avatar billede Slettet bruger
07. december 2003 - 14:13 #16
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

Linje 95 er while-sætningen.
Avatar billede skovenborg Nybegynder
07. december 2003 - 14:14 #17
du behøver ikke skrive AS kampinf - du kan godt nøjes med at skrive:
FROM kampinf, kampe
Avatar billede beef12 Nybegynder
07. december 2003 - 14:15 #18
hvad står der på linie 95? Er det der hvor slutparantesen står?
Avatar billede beef12 Nybegynder
07. december 2003 - 14:16 #19
hov, unskyld, så ikke din sidst linie: "Linje 95 er while-sætningen"
Avatar billede Slettet bruger
07. december 2003 - 14:16 #20
skovenborg...> Okay, er rettet.

beef12...> Linje 95 er selve linjen "while ($row_kampe = mysql_fetch_array($query_kampe))"
Avatar billede beef12 Nybegynder
07. december 2003 - 14:20 #21
jeg plejer at bruge " i stedet for ', så echo $row_kampe['b91_kampe.kampnr'];
bliver til echo $row_kampe["b91_kampe.kampnr"];
Avatar billede 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...
Avatar billede 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?
Avatar billede 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");

while ($row_kampe = mysql_fetch_array($query_kampe))
  {
    echo $row_kampe['kampnr'];
    echo "---";
    echo $row_kampe['dato'];
    echo "<br>";
  }

Nu kommer de rigtige 3 kampe, sorteret som de skal være, men de kommer 2 gange på skærmen?

Sådan her:
100016---20030317
100000---20030417
100015---20030518
100016---20030317
100000---20030417
100015---20030518
Avatar billede beef12 Nybegynder
07. december 2003 - 14:41 #25
tilføj:
AND kampnr != 100000
Avatar billede Slettet bruger
07. december 2003 - 14:42 #26
beef12..> Ehm, hvor skal den kamp sorteres fra?
Avatar billede beef12 Nybegynder
07. december 2003 - 14:42 #27
vrøvl - troede at det dublerede på en eller anden måde... lad være med det jeg lige skrev
Avatar billede beef12 Nybegynder
07. december 2003 - 14:44 #28
mon ikke den fremtræder to gange fordi, den først henter kampnr fra tabel kampinf og derefter fra tabel kampe... ved det ikke helt præcist

Anyone ?
Avatar billede beef12 Nybegynder
07. december 2003 - 14:47 #29
mysql_query("SELECT b91_kampe.kampnr, b91_kampinf.*

prøv at lave den om til:

mysql_query("SELECT b91_kampinf.*

Så tror jeg at du kun får de tre du skal bruge...
Avatar billede Slettet bruger
07. december 2003 - 14:48 #30
Nope, der sker det samme :o(
Avatar billede beef12 Nybegynder
07. december 2003 - 14:51 #31
sikker? Det burde den ikke.
Avatar billede Slettet bruger
07. december 2003 - 14:51 #32
beef12...> Beklager mange gange, har fundet en løkke længere oppe, der af en eller anden grund få scriptet til at køre igennem flere gange.

Endnu en gang, beklager.

Du får hermed pointene, og en stor tak for hjælpen....

Et sidste 'lille' spørgsmål.
Mine echo-sætninger, hvordan skal de skrives hvis jeg vil tage eks. kampnr. fra den ene table, kontra den anden tabel?
Avatar billede beef12 Nybegynder
07. december 2003 - 14:56 #33
det ved jeg ikke. Jeg ved at i Oracle så bitch'er den hvis man prøver at lave udtræk af samme felt hvis den eksisterer i begge tabeller.

Jeg tror aldrig at du får brug for at hente kampnr fra den ene tabel efterfulgt af kampnr fra den anden tabel, idet disse værdier er fuldstændig ens.

Skulle man endelig gøre det, så skal man nok lave 2 uafhængige SQL-sætninger og flette det hele sammen på denne måde.

Jeg er dog ikke helt sikker på mit postulat
Avatar billede beef12 Nybegynder
07. december 2003 - 14:57 #34
tak for points :o)
Avatar billede Slettet bruger
07. december 2003 - 17:05 #35
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.
Avatar billede 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)???
Avatar billede 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

AFDELINGSTABEL
---------------
afdelingsnr
gade
postnr

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.
Avatar billede 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*
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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