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
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.
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.
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.
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 ?
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.
$selectLaatstToegevoegdQuery = "SELECT
rating.*,
filmpjes.filmpjeid AS filmpjeid,
filmpjes.filmpje_bestandsnaam AS filmpje_bestandsnaam,
plaatjes.plaatjeid AS plaatjeid,
plaatjes.plaatje_bestandsnaam AS plaatje_bestandsnaam
FROM
rating
INNER JOIN
filmpjes
ON
filmpjes.filmpje_ratingid = rating.ratingid
INNER JOIN
plaatjes
ON
plaatjes.plaatje_ratingid = rating.ratingid
WHERE
filmpjes.filmpje_geaccepteerd = '1'
OR
plaatjes.plaatje_geaccepteerd = '1'
ORDER BY
rating.ratingid
ASC LIMIT
0,3";
$selectLaatstToegevoegdQuery ="SELECT
rating.*,
filmpjes.filmpjeid AS filmpjeid,
filmpjes.filmpje_bestandsnaam AS filmpje_bestandsnaam,
plaatjes.plaatjeid AS plaatjeid,
plaatjes.plaatje_bestandsnaam AS plaatje_bestandsnaam
FROM
rating
INNER JOIN
filmpjes
ON
filmpjes.filmpje_ratingid = rating.ratingid
INNER JOIN
plaatjes
ON
plaatjes.plaatje_ratingid = rating.ratingid
WHERE
filmpjes.filmpje_geaccepteerd = '1'
OR
plaatjes.plaatje_geaccepteerd = '1'
ORDER BY
rating.ratingid
ASC LIMIT
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?
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.
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!
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.
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!