Ik zit met een query waar ik even niet uit komt.

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?
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.
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'
En wat als je nog doet:

GROUP BY c.categorie

en

LIMIT 5

Ik heb geen idee wat er dan gebeurt, maar je zou het eens kunnen proberen.
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?
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.

Bouw je array dan als volgt op:

Array (
    [categorie1] => Array (
            [0] => bedrijf1
            [1] => bedrijf2
            )
    [categorie2] => Array (
            [0] => bedrijf3
            [1] => bedrijf4
            )
)

Reageren