Door
koh do
op 03-04-2015 11:41
gewijzigd op 03-04-2015 11:43
2.522 views
Misschien is de titel vaag maar het voorbeeld hieronder zou het duidelijk moeten maken. Ik zou graag het aantal combinaties van studenten weten hierin maakt de volgorde niet uit. Dus 2&1 en 1&2 moeten bij de zelfde groep worden opgeteld.
Select StudentID1, StudentID2, COUNT(*) Cnt
From studentCombinaties
GROUP BY StudentID1, StudentID2
Alleen in deze query wordt wel rekening gehouden met de volgorde.
Waarschijnlijk niet de netste of meest efficiƫnte oplossing, maar je zou de student-id's in oplopende volgorde aan elkaar kunnen rijgen en deze nieuwe variant groeperen.
SELECT COUNT(*), IF(StudentID1 < StudentID2, CON CAT(StudentID1, '-', StudentID2), CON CAT(StudentID2, '-', StudentID1)) AS test
FROM studentCombinaties
GROUP BY test
ORDER BY test
Dit levert dan zoiets op:
+----------+------+
| COUNT(*) | test |
+----------+------+
| 3 | 1-2 |
| 2 | 2-3 |
| 1 | 4-5 |
+----------+------+
3 rows in set (0.00 sec)
Hierbij doe je wel de aanname dat de student-id's (StudentID1, StudentID2) wel altijd verschillen, wat niet zo'n heel vreemde eis is (je kunt geen groep met jezelf vormen).
EDIT: CONCAT dient aan elkaar geschreven te worden...
Ik heb nog CAST toegepast anders kreeg ik de binaire vorm in plaats van gewoon de int. Ik krijg een forbidden error als ik de verbeterde code mee stuur. maar k heb dit gedaan in beide CONCAT's
<?php
CAST(StudentID1 AS CHAR(1))
?>
Maar ik heb nog wel een vraag: "Wat nou als er drie of meerdere columns zijn??"
Dan had je wat beter over je invoer-controles en database-structuur na moeten denken ;-).
Nou ja, dan haal je eenzelfde truuk uit, maar dan met 3 user id's?
Waar wil je precies naartoe? Wil je een generieke oplossing voor een brakke aanpak? Je bent denk ik het probleem op de verkeerde plaats aan het oplossen.
SELECT
g.combinatie,
COUNT(*) aantal
FROM
(
SELECT
combinatie_id,
GROUP_CON_CAT(s.student_id ORDER BY student_id SEPARATOR ' - ') combinatie
FROM
student_combinaties
JOIN
studenten_per_combinatie s
USING (combinatie_id)
GROUP BY combinatie_id
)
GROUP BY g.combinatie