Problem bei while Ausgabe

goto;

Erfahrenes Mitglied
Hallo liebe Community,
unzwar habe ich gerade ein PHP Defizit im Kopf.
Es geht um folgendes.
Ich habe eine Art Locationmap, in dieser soll in der Ersten Tabellenzeile alle Menüpunkte zu den einzelnen Locations angezeigt werden. Und direkt unter den Einzelnen Location, sollen alle Mitglieder angezeigt werden die derzeit dort drin sind. Das hat bisher alles funktioniert, jedoch war der Code zu lang und unsauber. Deswegen hab ich mich heute mal daran gemacht diesen zu kürzen. Doch jetzt stoße ich auf ein Problem. Mal zum Aufbau dieses Bereiches.

Die Menüpunkte besitzen folgende Werte:
name <-- Name des Menupunktes
location <-- ID des Menupunktes (1,2,3,4,5+++ usw. je nach Punkt aufsteigend)


Hier wird dann die Verbindung zur Tabelle hergestellt und die locations geholt und noch nach der ID geordnet.
PHP:
$bereichsql = "SELECT * FROM adminmenu ORDER BY location ASC";
$bereichquery = mysql_query($bereichsql) OR die (mysql_error());
while ($loc = mysql_fetch_array($bereichquery)) {

Und hier hole ich noch die User, wie zu sehen ist sollen nur die User geholt werden die in der location sind die gerade in der while-schleife behandelt werden.
PHP:
	$usersql = "SELECT * FROM admins WHERE location = '".$loc["location"]."'";
	$userquery = mysql_query($usersql) OR die (mysql_error());
	while ($user = mysql_fetch_array($userquery)) {
	$userloc .= $user["username"]."<br>"; }
	$bereiche .= "
	<td>
	".$loc["name"]."
	</td>";
	$user .= "	
	<td>".$userloc."</td>
	";
Jedoch werden mir immer alle Mitglieder, sein Sie in der location 1 oder 3 oder in der 5, diese werden immer in Location 1 angezeigt. Kann mir jemand helfen und erklären was ich falsch mache? wäre Super, Danke im vorraus.

PS: Im Html bereich ist nur der Tabellen ansatz und ein table row. Danach kommt direkt die Variable.
 
Ich würde beide Abfragen erstmal mit JOINS behandeln und danach in der Schleife verarbeiten. Vielleicht hilft dir der Gedanke.
 
Was ist laocation für ein Datentyp? Nach deiner beschreibung eher eine Zahl. Das würde bedeuten, dass du im where die '' weglassen musst.

Aber natürlich ist der Join die bessere Lösung, weill du damit die DB-Zugriffe minimieren kannst
 
Guten Morgen, hab mich eben mal daran gemacht. Das JOIN macht mir aber immer noch Probleme :/
Hier mal mein versuch.
PHP:
SELECT * FROM admins
JOIN adminmenu ON (adminmenu.location = admins.location)
Hier vergleiche ich ja jetzt die location´s. Wenn Sie identisch sind soll mir der Locationname und die User die drin sind angezeigt werden. Das query sieht aber anders aus. Er liefert mir zwar das richtige ergebniss wenn alle User in der selben location sind, aber sobald in location 1 niemand mehr ist, taucht diese nicht mehr in dem queryresultat auf.

Soetwas in der Richtung versuch ich zwar immer lieber selbst zu lösen, aber hier brauch ich wirklich hilfe.
Meine Tabellen sehen wie folgt aus.

Das ist die Tabelle adminmenu (Kommen natürlich noch mehr Datensätze rein.)
-----------------------
ID name location
1 Eingangsbereich 1
2 anderer Bereich 2
-----------------------



Das ist die Tabelle admins
-----------------------
ID name location
1 User1 1
2 User2 2
3 User3 2
-----------------------

Nun muss ja die abfrage wie folgt lauten:
PHP:
SELECT username FROM admins
JOIN adminmenu ON (adminmenu.location = admins.location)
Was ist daran falsch?

PS: Ja yaslaw es sind Zahlen, habs geändert, danke ;)
 
Zuletzt bearbeitet:
Mach aus dem JOIN ein LEFT JOIN

SQL:
SELECT username FROM admins
LEFT JOIN adminmenu ON (adminmenu.location = admins.location)
 
Zuletzt bearbeitet von einem Moderator:
Ah. Das sieht im Query schonmal gut aus.
Code:
id	name	link	rang	location	id	username	password	bereich1	bereich2	bereich3	usermail	date_lastlogin	picpath	rang	approved	location	chatonline	radioonline	Datum	IP	icq	aim	skype	msn	urlaub	urlaubgenommen	sonderurlaub	sonderurlaubgenommen	treuhandbereiche	
1	Eingangsbereich	join.php	0	1	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	
2	Admin Bereich	adminindex.php	1	2	4	scorpio	d4da364b2830b54eae0ecbae60025395							0	1	2	ja			0	0				0	0	0	0		
2	Admin Bereich	adminindex.php	1	2	5	Administrator	d4da364b2830b54eae0ecbae60025395	1	5	3	hhh	1260133299	IMG_9534-reihe2-01-web.jpg	1	1	2	nein	ja	2009-12-06 23:37:25	0					30	8	2	1

Wenn ich dann durch die while-schleife laufen lasse, erscheint dann aber wieder, wie oben Sichtbar, für "Administrator und Scorpio" jeweils einmal der Adminbereich.

Hab die while Schleife mal gekürzt das man es besser erkennt.
PHP:
...
while ($loc = mysql_fetch_array($bereichquery)) {
	

	$bereiche .= "
	<td>
	".$loc["name"].$loc["username"]."
	</td>";
	

	

}
Jetzt sollte ja direkt neben der Location die jeweiligen User angezeigt werden die dort sind, das heißt ( location 1 = NULL, location 2 = Administrator, Scorpio. Kann man die "Usernamen" aus der Tabelle admin.. im Query zusammenfügen. Sprich das es so aussieht.
Code:
id	name	link	rang	location	id	username	
1	Eingangsbereich	join.php	0	1		
2	Admin Bereich	adminindex.php	1	2	4	Administrator scorpio
Danke.
 
Du kannst im Query die Tabelle admins durch das folgende Subquery ersetzen, welches mit GROUP_CONCAT() due username pro location in ein Feld zusammenfast
SQL:
SELECT
	location,
	GROUP_CONCAT(DISTINCT username ORDER BY username SEPARATOR ' ')  AS usersnamen
FROM
	admins
GROUP BY
	location

Das müsste dann etw so aussehen:
SQL:
SELECT 
	*
FROM 
	(	SELECT
			location,
			GROUP_CONCAT(DISTINCT username ORDER BY username SEPARATOR ' ') AS usersnamen
		FROM
			admins
		GROUP BY
			location
	) AS a
	LEFT JOIN adminmenu 
		ON (adminmenu.location = a.location)
 
Zuletzt bearbeitet von einem Moderator:
Super, im Query Analyzer sieht es gut aus, schau es mir nach der Arbeit mal genauer an, vieles neues bei was ich mal noch Studieren muss. Danke yaslaw :)
 
Man findet immer wieder Befehle, die man noch nicht kannte - geht mir genauso. auf GROUP_CONCAT bin ich auch erst vor kurzem gestossen als ich eigentlich was ganz anderes suchte *g*

Mit was analysierst du die Queries?
 
Zurück