login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP/SQL] Top X (Opgelost)

Offline shibble - 11/01/2010 11:34 (laatste wijziging 11/01/2010 11:35)
Avatar van shibbleMySQL interesse Hallo allemaal,

Ik ben momenteel bezig met een project voor school.
nu heb ik een database met de volgende 3 tabellen:

- Filmpjes
- Plaatjes
- Rating

in de tabel filmpjes & plaatjes heb ik een veld genaamd "tabelname_ratingid" via dat veld haal ik dus de rating gegevens uit de database.
nu moet ik dus de 6 best rated artikelen uit de DB halen, hoe kan ik daarvoor zorgen?

de rating tabel bestaat uit de volgende velden:
ratingid
rating_votes
rating_total_votes
rating_ips

Mvg,

shibble

21 antwoorden

Gesponsorde links
Offline Martijn - 11/01/2010 12:49
Avatar van Martijn Crew PHP ik zie dat je een total voting heb? Dan doe je een INNER JOIN op het ratingid en dan het corresponderende id van je filmpjes/plaatjes
Offline shibble - 11/01/2010 14:34
Avatar van shibble MySQL interesse Hmmm ja maar ik heb het op een andere manier

total votes = elke keer als er gevote wordt +1
votes = 2, 5, 1, 1, 3 etcetc

dan explode ik votes en dan ga ik de score uitrekenen.

nu moet ik dus de top 6 hebben maar ik weet niet hoe..
kan je anders wel ff paar screenshots geven hoe me DB eruit ziet..
Offline ArieMedia - 11/01/2010 15:01
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
shibble schreef:
Hmmm ja maar ik heb het op een andere manier

total votes = elke keer als er gevote wordt +1
votes = 2, 5, 1, 1, 3 etcetc

dan explode ik votes en dan ga ik de score uitrekenen.

nu moet ik dus de top 6 hebben maar ik weet niet hoe..
kan je anders wel ff paar screenshots geven hoe me DB eruit ziet..
Ok, lekker onhandig, Als je het totaal aantal votes meeneemt in je tabel kan je uitrekenen wat de nieuwe score word.

Bijv: Score: 6 Votes: 8
Iemand stemt 10.
Votes = 6x8 = 48
Nieuwe score = (48 + 10) / 7
Offline Martijn - 11/01/2010 15:17
Avatar van Martijn Crew PHP dat is onjuist dan krijg je niet het juiste gemiddelde.

Ik denk dat je dan naar GROUP BY moet gaan, en iets met SUM() oid, iig een stuk lastiger dan je nu hebt
Offline ArieMedia - 11/01/2010 15:40
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Martijn schreef:
dat is onjuist dan krijg je niet het juiste gemiddelde.

Ik denk dat je dan naar GROUP BY moet gaan, en iets met SUM() oid, iig een stuk lastiger dan je nu hebt
En waarom krijg je dan niet het juiste gemiddelde?  
Offline shibble - 12/01/2010 09:04
Avatar van shibble MySQL interesse ok thanx 
maar ik snap er nu nog steeds geen hol van 
een artikel ofzo ?:$
Offline Gerard - 12/01/2010 10:29
Avatar van Gerard Ouwe rakker Laten we dan eerst eens de volgende vraag stellen: "Waarom hebben we een herhalende groep in één veld zitten, terwijl hier een aparte tabel voor zou moeten zijn?".

Eén rating moet gedaan worden op één film/afbeelding. Op deze manier zou je het net zogoed in de film/afbeelding tabel kunnen plaatsen.
Offline shibble - 12/01/2010 10:33 (laatste wijziging 12/01/2010 10:35)
Avatar van shibble MySQL interesse Ik weet het maar daar gaat het op dit moment niet om...
dus graag op de vraag blijven als het kan..

en hoe ik het nu heb kan ik ook de gevote score bij de juist ip eruit halen..
Offline Youri - 12/01/2010 11:38
Avatar van Youri Nieuw lid Pascal, omdat de gegevens op zijn geslagen als een array moet je gewoon de array sorten, en dan gewoon met een increment de eerste 5 selecteren..
Offline Gerard - 12/01/2010 12:46
Avatar van Gerard Ouwe rakker Je zult dan alle resultaten uit de database moeten vissen. Daarna moet je per item berekenen wat het gemiddelde is. Daarna moet je dit sorten. Daarna moet je dit tonen.

Als je wel normaliseert dan kan je dit gewoon in SQL afhandelen, met subqueries.
Offline Youri - 12/01/2010 15:44
Avatar van Youri Nieuw lid
Gerard schreef:
Je zult dan alle resultaten uit de database moeten vissen. Daarna moet je per item berekenen wat het gemiddelde is. Daarna moet je dit sorten. Daarna moet je dit tonen.

Als je wel normaliseert dan kan je dit gewoon in SQL afhandelen, met subqueries.


toch niet, hij selecteerd het toch op $ID, dus dan heeft hij maar 1 row als het goed is.
Offline Gerard - 13/01/2010 08:31
Avatar van Gerard Ouwe rakker Maar hij zal wel alle id's moeten selecteren als hij een gemiddelde wil berekenen. MySQL kan niets met een veld met daarin comma separated waardes.

Geef anders eens een dump van de database, misschien dat iemand zin heeft om er even iets voor te maken.
Offline shibble - 13/01/2010 10:55
Avatar van shibble MySQL interesse Wat youri zegt kan wel... ik snap het een beetje maar ik moet alleen uitvogelen hoe ik het goed in een array krijgen.

@Gerard
bedoel je met alle ID's dat ik alles uit Rating moet halen.
Dan klopt het wel ja, maar ik bedacht me net als ik nu een veld aan de rating tabel toevoeg genaamd "rating_totalscore" en daarin zet ik dan de totale score... dan hoef ik alleen maar een ORDER BY rating_totalscore ASC/DESC of is dat een domme oplossing ?

Groetjes
shibbleee
Offline Gerard - 13/01/2010 11:03
Avatar van Gerard Ouwe rakker Wanneer je echt niets kan veranderen aan je datamodel, dan is dat misschien wel de beste oplossing. Maar alsnog is het altijd aan te raden om gewoon goed te normaliseren.
Offline shibble - 13/01/2010 11:09 (laatste wijziging 14/01/2010 11:55)
Avatar van shibble MySQL interesse @Gerard
Heb even een dumpje gemaakt van de tabellen "rating", "filmpjes" & "plaatjes"

http://shibble.pastebin.com/m2cc54f37

Hopelijk hebben jullie hier wat aan .

ik heb nu gewoon een veld "rating_total_score" toegevoegd nu wil ik het dus met joins eruit halen:

  1. $selectLaatstToegevoegdQuery = "SELECT
  2. rating.*,
  3. filmpjes.filmpjeid AS filmpjeid,
  4. filmpjes.filmpje_bestandsnaam AS filmpje_bestandsnaam,
  5. plaatjes.plaatjeid AS plaatjeid,
  6. plaatjes.plaatje_bestandsnaam AS plaatje_bestandsnaam
  7. FROM
  8. rating
  9. INNER JOIN
  10. filmpjes
  11. ON
  12. filmpjes.filmpje_ratingid = rating.ratingid
  13. INNER JOIN
  14. plaatjes
  15. ON
  16. plaatjes.plaatje_ratingid = rating.ratingid
  17. WHERE
  18. filmpjes.filmpje_geaccepteerd = '1'
  19. OR
  20. plaatjes.plaatje_geaccepteerd = '1'
  21. ORDER BY
  22. rating.ratingid
  23. ASC LIMIT
  24. 0,3";


alleen dit werkt niet wat doe ik hier fout?
als ik de inner join van filmpjes weghaal en de where van filmpjes werkt die wel, dit zou ook moeten werken toch?

Mvg,

shibble
Offline rambo - 14/01/2010 17:20
Avatar van rambo HTML beginner Je hebt nu een query gemaakt waarbij zowel het rating_id in de plaatjes als de filmpjes tabel moet voorkomen. Omdat je dit waarschijnlijk niet wilt, kunt je een LEFT JOIN gebruiken waarbij je in je WHERE een voorwaarde opneemt dat wanneer plaatje_ratingid NULL is, filmpje_ratingid NOT NULL moet zijn, en andersom.

Wat je ook zou kunnen doen is het combineren van 2 queries met behulp van UNION (ALL). Op die manier maak je 2 queries waarbij je de ratings van de filmpjes en van de plaatjes afzonderlijk ophaalt en combineert door middel van UNION.

Ik moet zeggen dat ik het met Gerard eens ben wat betreft je database design. Het is écht niet makkelijk (en gewoonweg niet de bedoeling) om in één kolom meerdere waardes op te slaan. Hiervoor zou je beter je rating tabel kunnen wijzigen waarbij je bij elke vote een nieuwe regel opneemt. Vervolgens kun je (volgens mij) met AVG direct het gemiddelde uitrekenen.
Offline shibble - 15/01/2010 09:14
Avatar van shibble MySQL interesse @rambo

de rating_id komt voor in de plaatjes en filmpjes tabel, altijd is die gevuld met de ratingid.

ik ga ff kijke naar UNION wat ik daar allemaal mee kan doen 

ja ik weet dat me database design niet echt makkelijk is...
maar het moet toch ook op deze manier kunnen... en ik snap nog steeds niet waarom deze query niet werkt daar krijg ik ook geen uitleg over...

mochten mensen wat op deze query weten?
please let me known!

mvg,

shibble
Offline Youri - 15/01/2010 09:50
Avatar van Youri Nieuw lid @rambo @Gerard,

Ga ff een database testje draaien 1 op zijn manier en 1 op jou manier, en doe en ga kijken welke het snelst is d.m.v. microtime..

Het is gewoon een normale database structuur, en heb meerdere mensen gezien die dit zo gebruiken.
Offline shibble - 15/01/2010 10:32 (laatste wijziging 15/01/2010 10:39)
Avatar van shibble MySQL interesse Hallo,

ik ben bezig geweest met UNION en ben al behoorlijk ver gekomen,
de query haalt hem goed uit de DB alleen nu werkt er iets niet.

http://shibble.pastebin.com/m1e807e12


het stukje vanaf Line 41 t/m line 51, bij alles wat ik met die query uit de DB haal laat die op de site het volgende zien:

  1. <?php
  2. } elseif($biSelect['filmpjeid']) {
  3. ?>
  4.  
  5. <a href="<?php echo $config['www']['url']; ?>index.php?p=filmpjes&amp;id=<?php echo $biSelect['filmpjeid']; ?>"><img src="/uploads/filmpjes/converted/<?php echo str_replace(' ', '%20', $biSelect['afbeeldingnaam']); ?>" width="70" height="70" alt="<?php echo $biSelect['bestandsnaam']; ?>" /></a>
  6.  
  7. <?php
  8. }
  9. ?>


Nu is de vraag dus hoe komt dit, want in de query haalt die gewoon filmpjeid & plaatjeid zoals het in de query staat eruit.

Mvg,

shibble
Offline rambo - 15/01/2010 16:02
Avatar van rambo HTML beginner
Youri schreef:
@rambo @Gerard,

Ga ff een database testje draaien 1 op zijn manier en 1 op jou manier, en doe en ga kijken welke het snelst is d.m.v. microtime..

Het is gewoon een normale database structuur, en heb meerdere mensen gezien die dit zo gebruiken.


Ik heb hier niks gelezen over dat het één sneller is dan het ander, dat staat hier geheel los van.

Wat Gerard duidelijk probeert te maken is dat een term als normaliseren in dit geval nogal toepasselijk zou zijn. Dat jij deze oplossing vaker bent tegen gekomen, betekent niet dat deze oplossing daarom goed is.

Zoek anders een op normaliseren in Google en lees er wat over. Ben benieuwd of je er dan nog steeds op dezelfde manier over denkt.

@shibble: probeer eens het één en ander af te drukken door middel van print_r. Op die manier kun je kijken wat er nou precies in die $biSelect array zit.
Offline shibble - 18/01/2010 10:31 (laatste wijziging 18/01/2010 17:11)
Avatar van shibble MySQL interesse @rambo

Ik krijg het volgende terrug met print_r:

Citaat:
Array (
[filmpjeid] => 1
[bestandsnaam] => newenergy scream copy.jpg
[ratingid] => 1
[rating_votes] => 5,5,
[rating_total_votes] => 2
[rating_total_score] => 5
[rating_ips] => 10.2.69.30,10.2.69.40, )
newenergy scream copy.jpg

Array (
[filmpjeid] => 2
[bestandsnaam] => Picture 1.png
[ratingid] => 8 [rating_votes] => 4,
[rating_total_votes] => 1
[rating_total_score] => 4
[rating_ips] => 81.71.169.174, )
Picture 1.png

Array (
[filmpjeid] => 1
[bestandsnaam] => hiephoi.flv
[ratingid] => 2
[rating_votes] =>
[rating_total_votes] => 0
[rating_total_score] => 0
[rating_ips] => )


Dit is dus wat ik terug krijg hij maat van "plaatjeid" simpelweg "filmpjeid" hoe kan ik dit oplossen?
heb al geprobeerd met "AS id1 id2" maar dan wordt alles id1.



update
even bij een ander forum gevraagd en voila mensen maken daar geen probleem over hoe me db eruitziet, nee ze helpen me gewoon met het probleem 

dat was heel simpel op te lossen door een nepkolom like 'plaatje' AS recordtype & 'filmpje' AS recordtype er aan te toevoegen en opgelost 

toch allemaal bedankt voor het helpen , hopelijk volgende keer wel gewoon met het probleem en niet over hoe me db design eruitziet ofzo <3!


Mvg,

shibble
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.299s