Het betreft 3 tabellen; leden, leden_categorien, categorien. 1 lid kan in meerdere categorien voorkomen.
Nu wil ik als output een overzicht krijgen van alle categorien met daaronder bijbehorende leden.
Dus sorteren op categorie. Daaronder wil ik in willekeurige volgorde de leden weergeven.
Tot nu toe geen probleem.
SELECT
lc.lidid AS lidid,
c.categorie AS categorie,
l.bedrijf AS bedrijf
FROM
leden_categorien AS lc,
categorien AS c,
leden AS l
WHERE
c.catid = lc.categorie
AND
l.lidid = lc.lidid
ORDER BY
c.categorie ASC,
rand()
Alleen nu wil ik de volgorde van de catergorien ook willekeurig maken en als het even kan er ook voor zorgen dat er maximaal 5 leden geselecteerd worden.
Iemand een idee hoe dit aan te pakken? Vraag ik te veel van SQL?
1 ORDER BY c.categorie ASC, rand()
vervangen met ORDER BY rand()
2 LIMIT 5 erachter?
?
Onbekende gebruiker
12-07-2007 00:51
1) Nee werkt niet. De leden/categorien volgorde wordt nu ook de war gegooid
2) Nu is het totaal aantal records 5. Aantal leden per categorie moet 5 worden.
Nu wil ik als output een overzicht krijgen van alle categorien met daaronder bijbehorende leden.
Dit doeleinde is niet te bereiken met alleen SQL, je zult hier altijd nog PHP op toe moeten passen om de resultaten te interpreteren. De records die je ophaalt uit de database bestaan namelijk allemaal uit een id, categorie en bedrijf. En voor dezelfde categorieen is de waarde van categorie uiteraard hetzelfde.
Ik denk dat je beste oplossing is om eerst alle gegevens in PHP in een array te zetten, [php]shuffle[/php]() toe te passen, en vervolgens met een foreach loop alles weer uit te lezen.
?
Onbekende gebruiker
12-07-2007 18:44
Dat begrijp ik en weet ik maar waar ik op doelde dus dat
A
B
A
B
B
wordt
A
A
B
B
B
PHP zorgt idd gewoon voor de 'kopjes'
Ik heb geen idee wat er dan gebeurt, maar je zou het eens kunnen proberen.
?
Onbekende gebruiker
12-07-2007 22:13
Nee werkt (natuurlijk) niet.
Maar ik ben zelf ook al wat verder:
SELECT l.bedrijf AS bedrijf, c.categorie AS categorie
FROM leden AS l, categorien AS c
WHERE l.lidid IN (SELECT lidid FROM leden_categorien AS lc WHERE lc.categorie = c.catid)
ORDER BY categorie, rand()
Resultaat is een goede selectie. Alle leden komen per categorie achter elkaar. De leden komen in willekeurige volgorde.
@Herjan: nee juist niet. Dat is het verkeerde gebruik van GROUP BY! Zie ook de GROUP BY tutorial die hierover geschreven heb.
@Webmakerij: is je hele probleem nu opgelost?
?
Onbekende gebruiker
13-07-2007 18:33
Nog net niet helemaal, nu staan alle leden/bedrijven in een categorie keurig naar elkaar. Alleen nu zou ik graag nog deze 'blokken' door elkaar husselen.
De max. van 5 doe ik nu met PHP maar een SQL oplossing zou natuurlijk mooier zijn.
Dat door elkaar gooien van die blokken gaat je niet met SQL lukken. Wat je wel zou kunnen doen is de resultaten die je nu uit de database haalt eerst in een array zetten en vervolgens met shuffle() die array door elkaar gooien.