Avatar billede brianfrisch Nybegynder
03. juli 2002 - 14:13 Der er 15 kommentarer

Sortering af resultat i forhold til andet table

Hej.

Jeg har haft det samme problem længe, har læst alle steder, og kan simpelthen ikke få det til at fungere.

Jeg har en tabel med navnet "personer", som har følgende indhold:

id - navn
1 - Ole
2 - Hans
3 - Erik

Og så har jeg en tabel der hedder "point", som har følgende indhold:

personid - point
1 19
2 25
1 20
3 44
2 28
1 1

Tabellen fortæller i forhold til værdien "personid" hvor mange point de forskellige personer har fået. "personid" svarer naturligvis til "id" i tabellen "personer".

Nu er det så at jeg vil have sorteret resultatet efter hvor mange point de forskellige personer har fået, så det kommer til at se således ud:

Hans - 53 point
Erik - 44 point
Ole - 40 point

Hvordan gør jeg det? På forhånd tak!

Mvh
Brian Frisch
Avatar billede hansk Nybegynder
03. juli 2002 - 14:22 #1
Du bruger en sum.

Sådan her:

SELECT navn, sum(point.point) as point from personer, point
where personer.id=point.id
group by navn
order by point desc
Avatar billede proaccess Nybegynder
03. juli 2002 - 14:27 #2
Den kan da vel ikke være 200 points værd ... ?
Avatar billede brianfrisch Nybegynder
03. juli 2002 - 16:00 #3
Hmm jeg har rodet med det længe, og har som sagt ledt en del steder. Det har været en hurdle for mig i et stykke tid, og derfor ville jeg give mange point for det.

Men jeg vil også meget gerne have at vide, hvordan jeg echo'er resultatet?

Altså ikke kun den SELECT query, men også meget gerne resten så det kan vises i et table som dette:

<table>
<tr>
  <td>Hans</td>
  <td>53 point</td>
</tr>
<tr>
  <td>Erik</td>
  <td>44 point</td>
</tr>
<tr>
  <td>Ole</td>
  <td>40 point</td>
</tr>
</table>
Avatar billede hansk Nybegynder
03. juli 2002 - 23:23 #4
Her er lidt asp kode:

<html>
<title>Hente data fra database</title>
<head>
</head>
<body>
<%
' Databaseforbindelse
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = driver
Conn.Open DSN

' SQL forespørgsel
strSQL = "Select * osv"

' Udfør forespørgsel
Set rs = Conn.Execute(strSQL)

' Gennemløb Recordset (rs) med en løkke
Do

  ' Udskriv værdien af kolonnen Fornavn og fødselsdato
  Response.Write rs("navn") & " " & rs("point") & "<br>"

  ' Gå til næste Record i rs
  rs.MoveNext

' Fortsæt indtil rs er gennemløbet
Loop While Not rs.EOF

' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
</body>
</html>
Avatar billede muddi Praktikant
04. juli 2002 - 18:10 #5
Det laver du i SQL med joins... jeg kan godt bikse noget sammen til dig, hvis du lige har et øjeblik *G*
Avatar billede muddi Praktikant
04. juli 2002 - 18:29 #6
Mit eksempel antager at du har disse to tabeller i din databasen:


CREATE TABLE `personer` (
`id` TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`navn` VARCHAR(50) NOT NULL
);


CREATE TABLE `points` (
`id` TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`personid` TINYINT NOT NULL,
`point` TINYINT NOT NULL
);



Og sådan skal din forespørgsel være:

SELECT *, SUM(point) AS points_ialt FROM personer, points WHERE personer.id = points.personid GROUP BY personer.id ORDER BY points_ialt DESC LIMIT 0, 10
Avatar billede muddi Praktikant
04. juli 2002 - 18:40 #7
Hvis du skal have sprøjtet resultatet ud til browseren bør du bruge flg. kode:

<table>
<?php
connect(); //der connectes til DB
$foresp = mysql_query("SELECT *, SUM(point) AS points_ialt FROM personer, points WHERE personer.id = points.personid GROUP BY personer.id ORDER BY points_ialt DESC LIMIT 0, 10");
while($res = mysql_fetch_array($foresp)){
echo "<tr><td>".$res[navn]."</td><td>".$res[points_ialt]." point</td></tr>";
}
close(); //forb. til DB lukkes igen
?>
</table>
Avatar billede muddi Praktikant
04. juli 2002 - 18:44 #8
hansk >> jeg kan ikke se hvordan dit forslag skal kunne virke? Det er jo en en-til-mange database, så der er nødt til at være en primary-key i tabellen med points...! 'personid' er jo ikke unik da den findes på mange-siden i vores join. Det samme personid optræder mange gange i tabellen.

Derfor virker dit bud ikke i denne sammenhæng. Det er beregnet på en en-til-en database!
Avatar billede muddi Praktikant
04. juli 2002 - 18:52 #9
brianfrisch >> Brug denne forespørgsel i stedet for den jeg skrev før. Den nye returnerer kun de værdier du ønsker:

SELECT navn, SUM(point) AS points_ialt FROM personer, points WHERE personer.id = points.personid GROUP BY personer.id ORDER BY points_ialt DESC

hansk >> din SQL-forespørgsel returnerer kun flg.:

navn | point
------------
Hans | 25
Ole  | 19

Min kode returnerer flg.:

navn | points_ialt
------------------
Hans | 53
Erik | 44
Ole  | 40

Hvis der er noget vedr. disse typer af databaser:
  o en-til-en
  o en-til-mange
  o mange-til-en
  o mange-til-mange

Så spørg endelig :o)
Avatar billede hansk Nybegynder
06. juli 2002 - 11:20 #10
Har du fået det til at virke?

En lille syntaksfejl i mit SQL statement:

SELECT navn,  sum(point.point) as point from personer, point
where personer.id=point.personid
group by navn
order by 2 desc

Så virker den.

muddi> Det er altid en god ide at have styr på teorien før man begynder at kritisere andres forslag.
Avatar billede muddi Praktikant
06. juli 2002 - 14:21 #11
hansk >> hvad mener du?
Avatar billede hansk Nybegynder
06. juli 2002 - 14:57 #12
Der er ikke noget der hedder en-til-mange database.
Derimod er der noget der hedder relationel database, som er den mest almindelige type som anvendes i dag.
Det du blander sammen er relationer, hvor der findes flere typer, hvoraf du har listet nogle.
Avatar billede muddi Praktikant
06. juli 2002 - 15:03 #13
Du kan da godt have en en-til-mange relationel database?
Avatar billede hansk Nybegynder
06. juli 2002 - 19:49 #14
Nej, det kan du ikke.
Men du kan have en en-til-mange relation i en relationel database.
Avatar billede muddi Praktikant
06. juli 2002 - 19:54 #15
Ok, du vinder... har også set på din profil, at du har besvaret milliarder af spm. omkring databaser, så du ved nok en smule om det.

Jeg tror faktisk også det var dig der forklarede mig det dengang jeg selv lærte, hvordan man bruger relationer *LOL*

Du er mesteren *GG* Men dit første bud virkede ikke anyway :o)
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