Avatar billede megalw Nybegynder
29. november 2001 - 13:48 Der er 26 kommentarer og
3 løsninger

query

Hejsa
Hvordan laver jeg en query der henter alle brugere ud fra en tabellen users, alle point ud fra en tabellen pix, alle point fra tabellen source.

Det skal være sådan at jeg kan vise det antal brugere der er med deres respektive point inden for pix og source og sammenlagt.
Avatar billede megalw Nybegynder
29. november 2001 - 13:49 #1
Database struktur:


user:
username

pix:
username, point

source:
username, point
Avatar billede disky Nybegynder
29. november 2001 - 13:51 #2
select user.username, pix.point as pixpoint, source.point as sourcepoint from username,pix, source where pix.username=username.username and source.username=user.username

Sådanne.
Avatar billede megalw Nybegynder
29. november 2001 - 13:57 #3
disky: sorry, under pix og source hedder de ikke username, men udgiver :) min fejl beklager.

Kan jeg lokke dig til at tilpasse det til det ?
Avatar billede proaccess Nybegynder
29. november 2001 - 14:00 #4
SELECT user.username, pix.point pixpoint, source.point sourcepoint from (user left join pix on user.username=pix.udgiver) left join source on user.username=source.udgiver;

Så burde du også få dem med, som mangler points i den ene kategori...
Avatar billede megalw Nybegynder
29. november 2001 - 14:07 #5
proaccess: den siger Parse error... Er det her ikke rigtigt ?

$query = mysql_query(\"SELECT users.username, pix.point pixpoint, source.point sourcepoint from (users left join pix on users.username=pix.udgiver) left join source on users.username=source.udgiver\");
Avatar billede myplacedk Nybegynder
29. november 2001 - 14:21 #6
Hvis en bruger ikke er nævnt i `pix` eller `source`, så kommer de ikke med her. Du er nødt til at bruge LEFT JOIN som jeg har vist dig før.
Avatar billede disky Nybegynder
29. november 2001 - 14:21 #7
select user.username, pix.point as pixpoint, source.point as sourcepoint from username,pix, source where pix.udgiver=username.username and source.udgiver=user.username

forresten har left join det med at give dårligere performance i nogle tilfælde, så bare drop dem.

Avatar billede myplacedk Nybegynder
29. november 2001 - 14:25 #8
disky > Dårlig performance er da bedre end forkerte resultater?

\"Godt nok skal vi til Ålborg, men det er da hurtigere at køre til Kolding\"... ???
Avatar billede proaccess Nybegynder
29. november 2001 - 14:27 #9
>disky: \"bare drop dem.\" - Hvad med de username\'r, som ikke har en record i fx. pix ???
Avatar billede disky Nybegynder
29. november 2001 - 14:27 #10
han siger han vil have det hele, derfor går jeg ud fra det er når de findes, og ikke ved mangler hist og her.

din sammenligning er noget vrøvl.
Avatar billede megalw Nybegynder
29. november 2001 - 14:28 #11
myplace: okay, kan du så ikke smide noget kode ?

det du gav sidst kunne jeg ikke få til at virke helt efter hensigten !

Den hev for mange brugere frem !
Avatar billede proaccess Nybegynder
29. november 2001 - 14:29 #12
>megalw: Det kan være der er lidt problemer med paranteserne, jeg er ikke sikker på syntaxen på stående fod, måske kan myplackdk træde ind hér...
Avatar billede megalw Nybegynder
29. november 2001 - 14:31 #13
Prøver lige at forklarer det helt fra bunden, den kan godt være lidt tricky.

Jeg vil lave en liste med ALLE brugerne, uanset om de har en row i source eller pix tabellen.

Derefter vil jeg så liste alle disse brugere og vise hvor mange point de har i de 2 kategorier!
Avatar billede disky Nybegynder
29. november 2001 - 14:31 #14
prøv med:

SELECT user.username, pix.point pixpoint, source.point sourcepoint from user (left join pix n user.username=pix.udgiver) left join source on user.username=source.udgiver;

Avatar billede megalw Nybegynder
29. november 2001 - 14:34 #15
disky -->

så kommer den med følgene fejl meddelse:

You have an error in your SQL syntax near \'(left join pix n users.username=pix.udgiver) left join source on users.username=\' at line 1
Avatar billede myplacedk Nybegynder
29. november 2001 - 14:35 #16
megalw, du har jo egentlig dummet dig lidt her.

Først oprettede du spørgsmålet i PHP-gruppen. Efter at have vist dig et stykke af vejen anbefalede jeg dig at flytte spørgsmålet her over. Det gjorde du egentlig ikke, du oprettede ca. det samme spørgsmål igen.
Hvis du nu henviste til det gamle spørgsmål, eller fortalte hvad vi var nået frem til, så kunne vi arbejde videre, i stedet for at starte forfra.

Prøv at vise den SQL jeg lavede til dig i sidste spørgsmål. Fortæl hvad den gør, så er der nok én der kan tilpasse den, så den gør det rigtige i stedet.

(Som jeg sagde i det andet spørgsmål var det ikke den endelige løsning, men det er et stykke af vejen)
Avatar billede megalw Nybegynder
29. november 2001 - 14:37 #17
Skulle jeg måske have gjort:

Se det andet spørgsmål her
http://www.eksperten.dk/spm/139761
Avatar billede proaccess Nybegynder
29. november 2001 - 14:43 #18
SELECT users.username, Sum(pix.point) pixpoint, sum(source.point) sourcepoint from users left join pix on users.username=pix.udgiver left join source on users.username=source.udgiver group by users.username;

Fjern paranteserne, og bestem dig for om din tabel hedder \"user\" eller \"users\"...
Avatar billede disky Nybegynder
29. november 2001 - 14:46 #19
hvis han fjerner paranteserne i dit sidste eksempel virker det med sikkerhed ikke
Avatar billede megalw Nybegynder
29. november 2001 - 14:50 #20
proaccess: den hedder users !

Hvordan for jeg den så til at sortere efter hvem der har flest pixpoint, flest soucepoint og flest point ialt ?

Har sat point op til 100 !
Avatar billede disky Nybegynder
29. november 2001 - 14:52 #21
tilføj

order by pix.point, source.point, sum(pix.point+source.point)
Avatar billede megalw Nybegynder
29. november 2001 - 14:54 #22
disky: Invalid use of group function

Den skal kun sortere en af gangen, altså sådan at man kan vælge om den skal sortere efter pix point source point eller sum
Avatar billede myplacedk Nybegynder
29. november 2001 - 14:55 #23
SELECT users.username, SUM(pix.point) AS pixpoint, SUM(source.point) AS sourcepoint FROM users LEFT JOIN pix ON users.username=pix.udgiver LEFT JOIN source ON users.username=source.udgiver GROUP BY users.username ORDER BY pixpoint DESC;

Jeg har indsat \"AS\" for at vise lidt tydeligere hvad der foregår, og så har jeg skrevet al MySQL med stort (af samme årsag).
Og så har jeg såmen bare sat en almindelig dødelig ORDER BY ind...

Du kan måske tilføje en kolonne mere, som er point ialt. Så kan du også sortere efter den.
Hmmm...
ADD(pixpoint, sourcepoint) AS pointialt
Måske... Gider ikke lige slå det op. :)
Avatar billede proaccess Nybegynder
29. november 2001 - 14:56 #24
>disky: Det var nu kun paranteserne i selve joinet, jeg mente... ;-) Alt andet er jo underforstået...

>megalw: Tilføj
order by sum(pix.point) desc, sum(source.point) desc
det burde funktionere...
Avatar billede megalw Nybegynder
29. november 2001 - 14:59 #25
proaccess - kommer med samme fejl !

Invalid use of group function
Avatar billede megalw Nybegynder
29. november 2001 - 15:04 #26
myplacedk < der ramte du plet...

Har bare et andet problem nu, hvordan viser jeg eksempel pixpoint

har prøvet bare at skrive $pixpoint det hjalp ikke
Avatar billede myplacedk Nybegynder
29. november 2001 - 15:11 #27
Det viser du ligesom du viser alt det andet, som `username` osv.
Avatar billede megalw Nybegynder
29. november 2001 - 15:15 #28
Doh - ja der er jo heller ingen grund til at gøre det mere besværligt end det er... !

Smider 100 point til dig myplacedk for det rigtige svar

og 25 til både disky og proaccess for den ihærdige indsats.
Avatar billede disky Nybegynder
29. november 2001 - 15:17 #29
jeg takker og bukker
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