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.
Yeh Yoeri,

Dit vraagt om een ManyToMany relatie. Ofwel je hebt een koppeltabel nodig:

Tabellen:
- users
- groups
- user_group

De koppeltabel heeft (meestal) maar twee kollommen: user_id en group_id. Je kunt een primary key toevoegen op deze twee kolommen gezamenlijk.

Je krijgt dan in de koppeltabel:

user_id group_id
1   2
2   1
3   1
3   3


en je query wordt iets als

SELECT u.id, u.username, g.id, g.name
FROM users u
INNER JOIN user_group ug ON u.id = ug.user_id
INNER JOIN groups g ON g.id = ug.group_id

[/code]
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

Jan
@frank,


Ik heb een koppeltabel gemaakt zoals je aangaf maar zit nu met het volgende:

Als een user 2 groepen heeft zoals Jan dan word deze 2x in het resultaat weergegeven

Bert Geel
John Blauw
Jan Blauw
Jan Rood

Kan het ook dat deze als 1 resultaat eruit rolt
Bert Geel
John Blauw
Jan Blauw, Rood
Ja, via group_concat. zie ook mijn sql voorbeeld.

SELECT 
	u.id, 
	USERNAME,
    (select 
     	GROUP_CONCAT(name) 
     FROM
     	user_group ug 
     join
     	groups g2
     	on ug.group_id=g2.id
     WHERE
     	ug.User_id=u.ID )
from
	users u


PS group en name zijn reserveerde namen in sql. je gebruikt deze als veldnamen!
merk trouwens op dat GROUP een gerserveerd woord is, en dus niet zo maar voor een kolomnaam gebruikt mag worden.

https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-G

@Jan
waarom een subquery. Waarom niet als


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:';

$user_id = $row['id'];
}

echo ' <a href="groups.php?id=' . $row['group_id'] . '">' . $row['group_name'] . '</a>';
}
Ivo P op 09/01/2020 10:48:51

waarom een subquery. Waarom niet als---


Komt op hetzelfde neer. niet aan gedacht :)


[size=xsmall]Toevoeging op 10/01/2020 07:04:45:[/size]

Frank Nietbelangrijk op 10/01/2020 05:53:43

En dan nog je krijgt een soort string met komma gescheiden waarden. Moet je weer met explode() gaan klooien ;-)


Hangt van het doel af. Bij mij is komma ideaal. Dan staat er Webbeheerder, toernooileider

Jan

Reageren