genion18
Goto Top

Aus 3 Tabellen ein User mit Ränge in (option)-ausgeben

Hallo,

ich verzweifle schon ein wenig...

und zwar möchte ich aus 3 Tabellen merere User mit Ränge in <option> setzen/ausgeben.

folgende SQL:

(handle_user)
-ID -Handle -password -email
-1 -karl -xxxxx -xxxx.xx
-2 -hubert -xxxxxx -xxxx.xx
-3 -fritz -xxxxxx -xxxx.xx
-4 -maria -xxxxxx -xxxx.xx
-5 -isolde -xxxxxx -xxxx.xx
-6 -hubert -xxxxxx -xxxx.xx

(handle_group)
-id -group_name -aka
-1 -uhu -vogel
-2 -katze -tier
-3 -maus -tier
-4 -taube -vogel

(group_members)
-id -scener_handel -scener_name -group_id
-1 -2 -hubert -1
-2 -1 -karl -3
-3 -4 -maria -1
-4 -2 -hubert -2
-5 -2 -hubert -4
-5 -4 -maria -2

so die aufteilung in der SQL.

Und hier der Code: (ist sicher vieles falsch drin).

<?PHP

//$sql = 'SELECT * FROM handle_user WHERE handle order by handle'; 
//foreach ($pdo->query($sql) as $row6) {
$zählerb = '0';  
$ghf = '0';  
//$sql = 'SELECT * FROM group_members WHERE scener_name = "'.$row6['handle'].'" order by scener_name'; 
$sql = 'SELECT * FROM group_members order by scener_name';  
foreach ($pdo->query($sql) as $row3) {


if ($ghf == $row3['scener_handle']){  
ECHO "/";  
$zählerb ='1';  
}ELSE{
ECHO ")</option>";  
ECHO "<option value='".$row3['scener_handle']."'>".$row3['scener_name']."";  
}
$ghf = $row3['scener_handle'];  
$sql = 'SELECT * FROM handle_group WHERE id = "'.$row3['group_id'].'"';  
foreach ($pdo->query($sql) as $row1) {
if ($ghf == $row3['scener_handle']){  
IF ($zählerb){
}ELSE{
ECHO " (".$row1['group_name'];  
}
//}
if ($zählerb){
ECHO $row1['group_name'];  
}
}ELSE{
}
}
}
if ($zählerb){
echo ")</option>";  
}
?>

Dann müsste:

id3 <option>fritz</option)
id2 <option>hubert (uhu/katze/taube)</option)
id6 <option>hubert</option)
id5 <option>isolde</option>
id1 <option>karl (maus)</option)
id4 <option>maria (uhu/taube)</option)

ausgeben, wo er nur bis jetzt

<option>hubert (uhu/katze/taube)</option)
<option>karl (maus)</option)
<option>maria (uhu/taube)</option)

ausgiebt, wenn ich die erste SQL oben mit reinsetze ist es ganz durcheinander.

greets

Content-ID: 671579

Url: https://administrator.de/forum/aus-3-tabellen-ein-user-mit-raenge-in-option-ausgeben-671579.html

Ausgedruckt am: 31.03.2025 um 06:03 Uhr

DivideByZero
DivideByZero 23.02.2025 aktualisiert um 18:46:01 Uhr
Goto Top
Hmm, wie meinen? Schon sprachlich bin ich da ein wenig verwirrt, aber auch die technischen Begriffe lassen mich etwas ratlos zurück...
genion18
genion18 23.02.2025 aktualisiert um 18:57:39 Uhr
Goto Top
hy,

ich hab 3 sql tabellen:

(handle_user)
-ID -Handle -password -email
-1 -karl -xxxxx -xxxx.xx
-2 -hubert -xxxxxx -xxxx.xx
-3 -fritz -xxxxxx -xxxx.xx
-4 -maria -xxxxxx -xxxx.xx
-5 -isolde -xxxxxx -xxxx.xx
-6 -hubert -xxxxxx -xxxx.xx

(handle_group)
-id -group_name -aka
-1 -uhu -vogel
-2 -katze -tier
-3 -maus -tier
-4 -taube -vogel

(group_members)
-id -scener_handel -scener_name -group_id
-1 -2 -hubert -1
-2 -1 -karl -3
-3 -4 -maria -1
-4 -2 -hubert -2
-5 -2 -hubert -4
-5 -4 -maria -2

wo er mir z.b. bei echo

-id -Handle
-3 -fritz
-2 -hubert (uhu/katze/taube)
-6 -hubert
-5 -isolde
-1 -karl (maus)
-4 -maria (uhu/taube)

ausgeben soll.

greets
DivideByZero
DivideByZero 23.02.2025 um 19:16:55 Uhr
Goto Top
Das macht weiterhin keinen Sinn. Wonach soll das denn wie sortiert werden? Das macht doch vorne und hinten keinen Sinn. Isolde ist in keiner Gruppe, wird aber ausgegeben?
genion18
genion18 23.02.2025 aktualisiert um 19:36:00 Uhr
Goto Top
hy,

genau so ist der sinn. das alle User ausgegeben werden, auch die nicht in eine gruppe sind.

nur die in eine oder mehrere gruppen sind sollen dann zusammengeführt werden, das die gruppen dann mit
/ getrennt sind. so wie oben beschrieben.

hubert ist auch 2 mal, einmal in 3 gruppen und einmal ohne gruppe, und soll auch so in der userliste angegeben werden.

einmal hubert (uhu/katze/taube) mit der id 2
und einmal hubert mit der id 6

Wie oben beschrieben, gibt er mir alle User die in eine Gruppe sind aus, nur nicht die, die nicht in eine Gruppe sind, und das ist wo ich nicht weiterkomme und dran verzweifle.

greets
em-pie
em-pie 23.02.2025 um 19:46:22 Uhr
Goto Top
Moin,

Ok, das Ziel habe ich verstanden.
Welches DBMS kommt zum Einsatz? Danach richtet sich die Lösung. Bei MsSQL wäre z.B. was mit STUFF() und XML PATH() machbar.

Und du musst mit einem LEFT JOIN() arbeiten. Das klappt bei MS SQL ebenso wie bei MySQL etc.


Und ein Tipp:
Dein Formatierungstil ist … ausbaufähig. Arbeite mal mit Tabs oder besser Leerzeichen. Das macht im Quellcode den Lesefluss leichter.

P.S.
Stelle deine Tabellen hier mal auch als Tabellen dar: Formatierungen in den Beiträgen
DivideByZero
DivideByZero 23.02.2025 um 20:25:37 Uhr
Goto Top
genau so ist der sinn. das alle User ausgegeben werden, auch die nicht in eine gruppe sind.
Wie oben beschrieben, gibt er mir alle User die in eine Gruppe sind aus, nur nicht die, die nicht in eine Gruppe sind, und das ist wo ich nicht weiterkomme und dran verzweifle.
Ist ja auch logisch, da Du an keiner Stelle (ok, doch, 1x auskommentiert 😉) die Tabelle "handle_user" abfragst.
DivideByZero
DivideByZero 23.02.2025 aktualisiert um 22:06:33 Uhr
Goto Top
Der grundsätzliche Ansatz ist:
  • lies nacheinander alle Einträge der Tabelle "handle_user" ein
  • für jeden Eintrag ermittele, ob er in der Tabelle "group_members" ist (und zwar anhand der ID handle_user:id = group_members:scener_handel)
  • falls ja, löse den Gruppennamen über die Tabelle "handle_group" auf (über group_members:group__id = handle_group:id)
Das dann entweder direkt in SQL als SQL-Abfrage (perfekt) oder von Hand nachgelagert in PHP.
genion18
genion18 23.02.2025 aktualisiert um 20:56:37 Uhr
Goto Top
hy,

die sql tabellen.

handle_user
id | scener_handel | password | email
1 | karl | xxxx | xxx.de
2 | hubert xxxx | xxx.de
3 | fritz | xxxx | xxx.de
4 | maria | xxxx | xxx.de
5 | isolde | xxxx | xxx.de
6 | hubert | xxxx | xxx.de

group_members
id | scener_handel | scener_name | group_id
1 | 2 | hubert | 1
2 | 1 | karl | 3
3 | 4 | maria | 1
4 | 2 | hubert | 2
5 | 2 | hubert | 4
6 | 4 | maria | 2

handle group
id | group_name | group_id
1 | uhu | vogel
2 | katze | tier
3 | maus | tier
4 | taube | vogel


LEFT JOIN() bei MySQL Bömische dörfer bei mir.

Greets
em-pie
em-pie 23.02.2025 um 21:13:08 Uhr
Goto Top
LEFT JOIN() bei MySQL
Dann arbeite dich ein.
Und können wir davon ausgehen, dass du MySQL als DBMS einsetzt?
Denn wie gesagt, danach richtet sich die Lösung.
Deine Naforderung lässt sich komplett im SQL-Query abbilden.


P.S.
Lies dir nochmal die Holfe zur Formatierung von Tabellen hier durch und korrigiere deine Darstwllung oben.
So hätte ich es erwartet:
handle group
id group_name group_id
1 uhu vogel
2 katze tier
3 maus tier
4 taube vogel
DivideByZero
DivideByZero 23.02.2025, aktualisiert am 24.02.2025 um 01:22:09 Uhr
Goto Top
LEFT JOIN() bei MySQL Bömische dörfer bei mir.
Dem kann man abhelfen: learnsql.de/blog/9-praktische-beispiele-fuer-sql-left-join/

Welches DBMS kommt zum Einsatz?
Die Frage sei hiermit wiederholt.

Klingt alles irgendwie nach Schulaufgabe. Jedenfalls darfst Du auch Eigeninitiative zeigen.
genion18
genion18 24.02.2025 aktualisiert um 16:36:47 Uhr
Goto Top
Hallöchen,

so weit, so gut die Mysql Abfrage.

danke nochmal für die Tips, mit INNER JOIN und Group_concat klappt es jetzt.

Wie bekomme ich die User in der Auflistung, die nicht in der Gruppe sind oder muss ich dafür eine Blank Group setzen?

greets
em-pie
em-pie 24.02.2025 aktualisiert um 16:43:15 Uhr
Goto Top
danke nochmal für die Tips, mit INNER JOIN und Group_concat klappt es jetzt.
Schon mal gut face-smile

Wie bekomme ich die User in der Auflistung, die nicht in der Gruppe sind oder muss ich dafür eine Blank Group setzen?
Oben anstelle des INNER JOIN() ggf. ein LEFT JOIN() nutzen.
Oder die Abfrage (angepasst) wiederholen, und mit einem UNION ALL kombinieren:
SELECT spalte1, spalte2, spalte3 FROM myTable WHERE spalte3 NOT NULL

UNION ALL

SELECT spalte1, spalte2, spalte3 FROM myTable WHERE spalte3 IS NULL

Mehr ist, ohne dein Statement zu kennen, nicht an Hilfe möglich
genion18
genion18 24.02.2025 um 16:55:19 Uhr
Goto Top
Hallöchen,

danke, LEFT JOIN war die lösung von dem problem. mal ebend alles abgeändert und schon zeigt er auch die Gruppenlosen an, so wie es soll.

danke nochmal für die tips.

greets
DivideByZero
DivideByZero 24.02.2025 um 16:58:50 Uhr
Goto Top
Dann fehlt ja eigentlich nur noch: Wie kann ich einen Beitrag als gelöst markieren?.

Außerdem wäre es für die Nachwelt nett, wenn Du dann das korrigierte Script hier auch einstellst, oder ggf. das SQL-Statement.
genion18
Lösung genion18 24.02.2025 aktualisiert um 17:04:52 Uhr
Goto Top
hy,

das Script.

$sql = 'SELECT hu.id,   
       hu.handle, 
       Group_concat(hg.group_name SEPARATOR "/" ) group_names   
FROM   handle_user as hu 
       LEFT JOIN group_members as gm 
               ON hu.id = gm.scener_handle 
       LEFT JOIN handle_group as hg 
               ON gm.group_id = hg.id 
GROUP  BY hu.id
ORDER  BY hu.handle 
';  

greets