Door
Yoeri Achterbergen
op 08-01-2020 01:44
gewijzigd op 08-01-2020 01:46
3.465 views
Goede avond,
Ik heb een vraag betreft 2 tabellen die ik gecombineerd wil serveren.
De situatie kort uitgelegd.
tabel: groups
ID NAME
1 Blauw
2 Geel
3 Rood
Tabel: users
ID USERNAME GROUP
1 Bert 2
2 John 1
3 Jan 1, 3
Als resultaat wil ik:
Bert Geel
John Blauw
Jan Blauw, Rood
De GROUP id's matchen met de nummers in de users kolom GROUP.
Bert en John kan ik makkelijk met een INNER JOIN doen maar Jan heeft 2 group ID's.
<?php
SELECT users.id, users.username users.group, groups.id, groups.name
FROM users
INNER JOIN groups ON users.group=groups.id
?>
Mijn vraag is dan ook welke type kolom voor users.group kan ik het beste hiervoor gebruiken en hoe kan ik meerdere waardes krijgen zoals het voorbeeld van Jan.
Als je dan toch 2X user jan hebt in tabel users kan dit misschien ook.
[/code]SELECT
id,
USERNAME
,(select GROUP_CONCAT(name) from groups g where g.ID in (SELECT u2.GROUP from users u2 where ID=u.ID)) groepen
from
users u
GROUP BY
id
[/code]
Frank zijn oplossing met tussen tabel is wel veel beter
SELECT
u.id,
u.USERNAME,
GROUP_CONCAT(g.name)
FROM users u
JOIN user_group ug ON ug.user_id = u.id
JOIN groups g ON ug.group_id=g.id
GROUP BY u.id, USERNAME
Het enigste is dat je dan wel de groepsnamen hebt maar niet de bijbehorende groep-ids. Wat nou als je die beiden nodig hebt? Ik kan me wel indenken dat je nog een GROUP_CONCAT toevoegt maar dan heb je twee lijstjes..
En dan nog je krijgt een soort string met komma gescheiden waarden. Moet je weer met explode() gaan klooien ;-)
@ts
Je kunt in de view mijn oplossing gewoon gebruiken al wordt het wel wat omslachtiger..
<?php
$user_id = null;
while ($row = mysqli_fetch_assoc($result)) {
if($user_id !== $row['id'] {
// start with new user
echo 'username: ' . $row['username'] . '<br>';
echo 'groups:';