Avatar billede testwatest Nybegynder
11. februar 2007 - 18:39 Der er 29 kommentarer og
1 løsning

Hent bedømmelse af en bruger i 1 forespørgelse

Hvis jeg henter brugerinformationer ud af en tabel således:

select * from brugere where id = '$id' limit 1

Hvordan får jeg så også denne brugers bedømmelse med? Jeg har alle bedømmelserne i en særskilt tabel ved navn: "brugere_karma".

Er det så ikke noget alá:

select
`brugere`.*,
avg( `brugere_karma`.`rate` ) as `gennemsnit`
from `brugere`
inner join `brugere_karma` on `brugere_karma`.`user_id2` = `brugere`.`id`
where
`brugere`.`id` = '{$id}'
limit
1
Avatar billede jakobdo Ekspert
11. februar 2007 - 20:19 #1
Prøv at fjern limit 1 i din sidste sql, hvad får du så af output?
Og du skal muligvis have group by brugere.id
Avatar billede coderdk Praktikant
11. februar 2007 - 21:53 #2
Ja enig med jakobdo, limit skal ikke være der, og du mangler en GROUP BY...
Avatar billede testwatest Nybegynder
13. februar 2007 - 18:12 #3
virker ikke.

Forespørgelsen skal jo bare tjekke om der findes rækker med `user_id2` som er det samme som brugerprofilens id, og hvis der ikke er skal det bare være 0%(eller 100%?) og ellers skal den finde gennemsnittet af alle de rækker der nu findes.
Avatar billede jakobdo Ekspert
13. februar 2007 - 18:22 #4
Så hvad får du af output når du laver:

select
`brugere`.*,
avg( `brugere_karma`.`rate` ) as `gennemsnit`
from `brugere`
inner join `brugere_karma` on `brugere_karma`.`user_id2` = `brugere`.`id`
where
`brugere`.`id` = '{$id}'
GROUP BY brugere.id
Avatar billede testwatest Nybegynder
13. februar 2007 - 22:33 #5
intet overhovedet. og den fejler hvis ingen rækker eksisterer i karma-tabellen.
Avatar billede jakobdo Ekspert
13. februar 2007 - 22:35 #6
Så kan du måske rette INNER JOIN til LEFT JOIN
Avatar billede testwatest Nybegynder
14. februar 2007 - 10:36 #7
hvad er forskellen?
Avatar billede jakobdo Ekspert
14. februar 2007 - 10:41 #8
Avatar billede testwatest Nybegynder
15. februar 2007 - 23:17 #9
Nu udskriver den blot intet. Kan jeg ikke få udskrevet 0?
Avatar billede testwatest Nybegynder
15. februar 2007 - 23:59 #10
.. hvis der ikke eksisterer nogle rækker under karma
Avatar billede jakobdo Ekspert
16. februar 2007 - 08:29 #11
Så skal du f.eks. lave en if(ISNULL(felt),0,felt)
Avatar billede testwatest Nybegynder
16. februar 2007 - 09:25 #12
hvordan skal den forespørgelse så helt præcist se ud?
Avatar billede jakobdo Ekspert
16. februar 2007 - 09:51 #13
select if(ISNULL(avg( `brugere_karma`.`rate` )),0,avg( `brugere_karma`.`rate` )) as `gennemsnit` ....
Avatar billede testwatest Nybegynder
16. februar 2007 - 09:58 #14
smid et svar jakobdo.

kan nedenstående ikke forkortes?

if( ISNULL( avg( ( `karma`.`rate`*2 )*10 ) ), 0, avg( ( `karma`.`rate`*2 )*10 ) ) as `rating`
Avatar billede testwatest Nybegynder
16. februar 2007 - 09:58 #15
eller i hvert fald gøres smartere
Avatar billede testwatest Nybegynder
16. februar 2007 - 10:00 #16
og har du et forslag til hvilke ratings man kan give en person, så det ikke er helt uoverskueligt? ved ikke hvordan det ville være smartest. om det skal være:

0, 25, 50, 75, 100
0, 1, 2, 3, 4
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

eller hvad. det er vel bare rimelig vigtigt, at man kan give 0%, 50% og 100%. Så der er noget middel, og noget der slet ikke giver 'point', og noget hvor der intet er at klage over.
Avatar billede jakobdo Ekspert
16. februar 2007 - 10:47 #17
0-10 ville jeg bruge.
Du kan jo altså sætte et 0 på når du viser det. :o)

Om det kan laves smartere ved jeg desværre ikke lige. :o(

Og du får et svar!
Avatar billede testwatest Nybegynder
16. februar 2007 - 11:30 #18
okay. ville du bruge et enum- eller int-felt?
Avatar billede testwatest Nybegynder
16. februar 2007 - 11:34 #19
hvis jeg har en der får 10 og en der får 0, så skal det jo give 50% med denne forespørgelse. men det giver 60 :S:S:S?

select
    if( ISNULL( avg( `karma`.`rate`*10 ) ), 0, avg( `karma`.`rate`*10 ) ) as `rating`
Avatar billede testwatest Nybegynder
16. februar 2007 - 11:35 #20
og det samme. hvis der er en der får 7 og 3, så giver det også 60%
Avatar billede jakobdo Ekspert
16. februar 2007 - 11:41 #21
0+10 = 10 / 2 = 5. :o)
Avatar billede testwatest Nybegynder
16. februar 2007 - 12:06 #22
præcis. men jeg får 6 i den forespørgelse
Avatar billede testwatest Nybegynder
16. februar 2007 - 12:09 #23
prøvede lige:

sum( `karma`.`rate` ) as `rate`


Det giver 12 :S Og er virkelig 100% sikker på, at jeg har tilføjet 0 og 10 i `rate`.
Avatar billede testwatest Nybegynder
16. februar 2007 - 12:16 #24
Det er fordi den plusser antallet af rækker, for har prøvet med nogle flere eksempler, hvor det har handlet om 3 stks, hvor den så har plusset med 3 :( Hvad kan man gøre?
Avatar billede testwatest Nybegynder
16. februar 2007 - 12:18 #25
if( isnull( avg( `karma`.`rate`*10 ) ), 0, avg( `karma`.`rate`*10 ) ) as `rating`,
count( `karma`.`id` ) as `totalVoters`,
sum( `karma`.`rate` ) as `totalRating`



`totalRating` bliver pludselig summen af `karma`.`rate`+`totalVoters` :S:S
Avatar billede jakobdo Ekspert
16. februar 2007 - 12:46 #26
SUM burde bestemt give 10.
Prøv at lave en simpel sql, som f.eks. hedder noget i stil med:
SELECT SUM(rate) FROM brugere_karma
Avatar billede testwatest Nybegynder
16. februar 2007 - 13:01 #27
også dér plusser den med antallet af rækker :S
Avatar billede testwatest Nybegynder
16. februar 2007 - 13:03 #28
nej. den plusser hver `rate` med 1
Avatar billede testwatest Nybegynder
16. februar 2007 - 13:04 #29
og det er nok fordi mit felt er ENUM og ikke INT. Men hvorfor må det ikke være ENUM? Og hvad bør det være i dette tilfælde?
Avatar billede jakobdo Ekspert
16. februar 2007 - 13:13 #30
INT vil være det mest rigtige, hvis vi snakker heltal.
TINYINT kan du jo bruge, hvis vi snakker 0-10 eller 0-100.
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