Archief - ORDER BY 'andere tabel'

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Syphon

Legacy Member
Ik heb een tabel waar dat alle gegevens instaan

id ; titel; beschrijving ; ...
1
2
3
------------------------
Dan heb ik voor views, ratings, comments verschillende tabellen. Hoe kan ik dan de hoofdtabel rangschikken op bv. aantal ratings, hoogste rating?

een vb van rating tabel;

id ; tut_id ; rating ;
1 . . . 2 . . . . 4
2 . . . 1 . . . . 3
3 . . . 2 . . . . 3

(tud_id slaat terug op de id's van hoofdtabel)
de volgorde waarop hij de hoofdtabel dan zou moeten rangschikken is :
2, 1, 3

Cycloon

Legacy Member
SELECT h.titel, h.beschrijving FROM hoofdtabel h JOIN ratingtabel r ON h.id = r.tut_id ORDER BY r.rating DESC

Volgende keer wel wat meer specifiek zijn over tabelnamen...

Syphon

Legacy Member
Ik heb al wat liggen prutsen met JOINS, LEFT JOINS, ... maar ik kom er niet uit

$result_tutoriallist = mysql_query("SELECT a.id, a.programma, a.onderverdeling, a.titel, a.beschrijving, a.uploader, a.thumbs, a.taal, a.status, a.extern, a.datum_upload FROM tutorials a WHERE a.status='goedgekeurd' ORDER BY a.datum_upload DESC ");

hier vraagt hij de hele lijst op van tutorials die ik in m'n database heb.
Ratings, views en comments hebben een aparte tabel => "tutorials_rating", "tutorials_views", "tutorials_comments".

Om een voorbeeld te nemen. "tutorials_rating" bestaat uit : tut_id (slaat terug op id in "tutorials"), rating (het cijfer)
------------------------------------------------------
TUTORIALS (dit is de lijst die wordt weergegeven op de website)
id | titel | beschrijving | ...
1 . bla1
2 . bla2
3 . bla3

TUTORIALS_RATING (elk rating per bezoeker is een nieuwe row).
tut_id | rating | ip
1 . . . . . 5
1 . . . . . 4
1 . . . . . 5
3 . . . . . 3
3 . . . . . 2

Wat er dan zou moeten gebeuren voor bv. de gemiddelde rating van een tutorial : Groeperen op tut_id en de AVG van de rating per tut_id nemen en deze terugkaatsen op de lijst van de tabel "tutorials".

Dan wordt zoals normaal gewoon de lijst van tutorials weergegeven, alleen ORDERT hij nu op de rating van de tutorial.

Ik hoop dat dit duidelijk genoeg is.

Cycloon

Legacy Member
Als ik het goed begrijp wil je dat er gesorteerd wordt op de gemiddelde rating?

SELECT h.titel, h.beschrijving, avg(r.rating) FROM tutorials as h JOIN tutorials_rating as r ON h.id = r.tut_id GROUP BY h.id ORDER BY 3 desc

killgore

Legacy Member
Cycloon zei:
Als ik het goed begrijp wil je dat er gesorteerd wordt op de gemiddelde rating?

SELECT h.titel, h.beschrijving, avg(r.rating) FROM tutorials as h JOIN tutorials_rating as r ON h.id = r.tut_id GROUP BY h.id ORDER BY 3 desc

GROUP BY h.id, h.titel, h.beschrijving

is eigenlijk iets correcter (veel db's zullen jouw query niet aanvaarden).

Cycloon

Legacy Member
killgore zei:
GROUP BY h.id, h.titel, h.beschrijving

is eigenlijk iets correcter (veel db's zullen jouw query niet aanvaarden).

I know, maar MySQL maakt daar geen zaak van, en als hij meerdere zaken zou selecteren zou hij da toch nie aanpassen waarschijnlijk.

MySQL is sowieso toch geen échte databank.

Syphon

Legacy Member
Op eerste zicht lijkt hij te doen wat hij moet doen. Ik heb wel LEFT JOIN genomen omdat hij ook de tutorials moet tonen waar nog niet op gerate is.
extra vraag: Is het het best om de tweede query (waarin hij extern het gemiddelde enzo berekent) laten vallen voor te echöen op de pagina?

de tutorials worden met while {} dus 1 voor 1 opgevraagd.

Per tutorial wordt apart het gemiddelde + aantal ratings uitgerekend. Is het nu sneller moest ik het allemaal in 1query doen?
vb. SELECT avg(r.rating) as trating, count(r.rating) as arating ...

LET OP! Standaard hoeft de query de tabel "tutorials_rating" niet te joinen. Omdat hij gewoon rangschikt op de kolom "datum" in de tabel "tutorials".

-------------------------------

dit is mijn volldige query :
$sql = "SELECT avg(r.rating) as trating, a.id, a.programma, a.onderverdeling, a.titel, a.beschrijving, a.uploader, a.thumbs, a.taal, a.status, a.extern, a.datum_upload

FROM tutorials a LEFT JOIN tutorials_rating r ON (a.id = r.tut_id)

WHERE a.programma='".return_categorykey($_GET['p'])."' AND a.status='goedgekeurd' ".(!empty($_GET['s'])?" AND a.onderverdeling='".addslashes($_GET['s'])."'":NULL)."

GROUP BY a.id ORDER BY trating DESC ".$pageswitcher->limit_fquery();

als er niet specifiek wordt gerangschikt op rating of views, ... rangschikt hij op datum met deze query.

$sql = "SELECT a.id, a.programma, a.onderverdeling, a.titel, a.beschrijving, a.uploader, a.thumbs, a.taal, a.status, a.extern, a.datum_upload

FROM tutorials a

WHERE a.programma='".return_categorykey($_GET['p'])."' AND a.status='goedgekeurd' ".(!empty($_GET['s'])?" AND a.onderverdeling='".addslashes($_GET['s'])."'":NULL)."

ORDER BY datum_upload DESC ".$pageswitcher->limit_fquery();

Cycloon

Legacy Member
Over het algemeen is het efficiënter om alles in 1 query te houden (en het komt de duidelijkheid van je code ook ten goede).

Syphon

Legacy Member
&content=tutorials&p=3ds-max
dit zou de normale query moeten opvragen, gewoon sorteren op datum (tabel tutorials)
----
&content=tutorials&p=3ds-max&r=rate
dit is de query met sorteren op avg van rating (tabel tutorials_rating)
----
&content=tutorials&p=3ds-max&r=arate
dit is de query met sorteren op count van rating (tabel tutorials_rating)
----
&content=tutorials&p=3ds-max&r=views
dit is de query met sorteren op count van views (tabel tutorials_views)
----
&content=tutorials&p=3ds-max&r=comments
dit is de query met sorteren op count van comments (tabel tutorials_comments)


Ik dacht de query te laten kiezen met "case"
maar als ik alles in 1 query zou willen zetten dan moet hij 3 verschillende tabellen opvragen. tutorials_rating, tutorials_views, tutorials_comments.

nu doe ik het per tutorial zo voor bv comments :
Code:
function return_amountrows($table, $query){
$rows=mysql_result(mysql_query("SELECT COUNT(*) FROM ".$table." ".$query),0);
return($rows);
}

return_amountrows(tutorials_comments, "WHERE tut_id='$row_tut->id'"

Dus ben je dan zeker dat moest ik alle 3 tabellen in 1 query kunnen zetten het sneller zou zijn. Rekening houdende dat er binnekort extreem veel rows zullen zijn.

Cycloon

Legacy Member
Het hangt er vanaf wat er normaal wordt opgehaald? Wordt er bij alle sorteer methodes dezelfde info getoond?

Zoja, alles in 1 query en met php enkel de sorteermethode opgeven (ORDER BY $sortmethode)

Als het niet zo is moet je toch meer specifiek zeggen wat je precies toont wanneer.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan