Tabelle -> Array -> Sortieren -> Statistik ausgeben?

Suchfunktion

Erfahrenes Mitglied
Moin.

Bedingt durch die Tatsache, dass ich es gewohnt bin, erst ab 9 Uhr zu arbeiten und die Tatsache, dass die kaffemaschine kaputt ist, bin ich heute noch nicht auf der geistigen Ebene, um folgendes Problem zu loesen:

Ich habe eine Staedte-Tabelle, in der zwei Spalten (id und stadtname) vorhanden sind.
Nun moechte ich eine Auflistung machen, welcher Staedtename wie oft in der Tabelle vorkommt. (Es gibt leider keine "vernuenftige" Normalisierung und die ist auch nicht so schnell umsetzbar, also muss ich wohl alle Eintraege in ein Array auslesen, sortieren und dann auszaehlen..)

Im endeffekt benoetige ich soetwas:

Datenbank-Tabelle (id und stadtname) :
1 Hamburg
2 Bremen
3 Hamburg
4 Muenchen
5 Berlin
6 Berlin
7 Hamburg


Ausgabe (in HTML) :
Berlin: 2
Bremen: 1
Hamburg: 3
Muenchen: 1


Also das Auslesen der Datenbank und die Uebergabe in ein Array sind nicht das Problem,
aber wie sortiere ich das und wie lese ich es am besten so aus, dass ich die Ausgabe habe, wie ich sie brauche (siehe oben)

(Am wichtigsten ist erstmal das "Auswerten" der Daten, also wie oft welche Stadt vorhanden ist. Das Sortieren des Arrays werd ich schon irgendwie schaffen. Hehe.)

Danke fuer eure Hilfe :)
 
Reicht es nicht aus, wenn du eine Abfrage machst, und sämtliche Städte in ein Array liest?
Beispielsweise so:
PHP:
  $result = mysql_query("SELECT stadtname FROM tabelle ORDER BY ID DESC");
  $stadtarray = mysql_fetch_assoc($result);

Das Array würde dann ja wie folgt aufgebaut sein (wenn ich mich auf deine obenb genannte Tabelle beziehe)

PHP:
$stadtarray = array("Hamburg","Bremen","Hamburg","Muenchen","Berlin","Berlin","Hamburg");

Wenn du das Array erstmal hast, kannst du doch ne Funktion schreiben, was in einer While immer wieder überprüft, wie oft ein Eintrag in array vorhanden ist. Dabei gehst du bei der überprüfung von links nach rechts. Ist die Stadt schon vorhanden, wird sie ignoriert.

Ich bin mir leider nicht ganz sicher, ob das so funktioniert wie ich mir das vorstelle, weil ich auch unter dem Problem kein Kaffe und Müdigkeit leide und meine konzentration auch nichtgerade hoch ist.

Ich hoffe es hilft dir oder gibt dir zumindest einen Denkanstoß.
 
Wenn du eine Lösung gefunden hast, würde es mich freuen, wenn du sie hier einmal präsentierst.

Sowas ist sicherlich als Referenz ganz nützlich.
 
So. Hab was.
Eventuell etwas unschoen, aber funktioniert (inkl. Ausgabe in einer Tabelle).
Das ganze funktioniert jetzt ohne direkter Array-Auswertung sondern mit angepassten SQL-Abfragen.

Script:
PHP:
....
// Wohnort
	$sql_demo_city = "SELECT distinct(STADTSPALTE) FROM STADTTABELLE ORDER BY STADTSPALTE ASC";
	$rs_demo_city = mysql_query($sql_demo_city);
	$customers_city_all = mysql_num_rows($rs_demo_city);
	$i=0;
	while($customers = mysql_fetch_assoc($rs_demo_city)){
		$demo_act_city = $customers['entry_city'];
		if (!empty($demo_act_city)){
			$sql_demo_cnt_city = "SELECT STADTSPALTE FROM STADTTABELLE WHERE entry_city = '$demo_act_city' ORDER BY STADTSPALTE ASC";
			$rs_demo_cnt_city = mysql_query($sql_demo_cnt_city);
			$demo_act_cnt_city = mysql_num_rows($rs_demo_cnt_city);
			$customers_city .= "<td width=\"200\">$demo_act_city:</td>";
			$customers_city .= "<td width=\"50\">$demo_act_cnt_city</td>";
			$i++;
			if ($i==3){
				$customers_city .= "\n</tr>\n<tr>\n";
				$i=0;
			}else{
				$customers_city .= "<td width=\"2\">&nbsp;</td>\n";
				$customers_city .= "<td width=\"1\" bgcolor=\"#cccccc\">&nbsp;</td>\n";
				$customers_city .= "<td width=\"2\">&nbsp;</td>\n";
			}
		}
	}
....

Ausgabe:
HTML:
	<strong>Wohnort:</strong> <font size="-2" face="Verdana, Arial, Helvetica, sans-serif">(<?php echo $customers_city_all; ?>)</font>
		<table width="760" border="0" border="0" cellpadding="0" cellpadding="0">
			<?php echo $customers_city ?>
		</table>

Ihr muesst halt STADTSPALTE und STADTTABELLE jeweils in den MySQL-Abfragen anpassen und natuerlich erstmal eine Datenbankverbindung aufbauen.. is ja klar ;)

Aussehen tut das ganze dann so:
staedteyz8.jpg


Hoffe das hilft jemandem weiter :)
 
Zuletzt bearbeitet:
Es geht auch noch einfacher mit nur einer Abfrage:
Code:
SELECT
        `stadtname`,
        COUNT(*) AS `anzahl`
  FROM
        …
  GROUP BY
        `stadtname`
  ORDER BY
        `stadtname`
 
Die Frage ist aber dann, ob es bei der Ausgabe innerhalb einer while nicht zu Komplikationen kommt.

Ich meine könnte es nicht passieren, dass dann es in etwa so aussieht:

1 Hamburg: 3
2 Bremen: 1
3 Hamburg: 3
4 Muenchen: 1
5 Berlin: 2
6 Berlin: 2
7 Hamburg: 3
 
Den Vorschlag von Gumbo hätte ich auch gemacht, das ist wesentlich einfacher und man kann doch Sortieren wie man will mit der ORDER BY-Bedingung. ;)
 
Hallo!
weedo hat gesagt.:
Ich meine könnte es nicht passieren, dass dann es in etwa so aussieht:
Dieses sollte eigentlich durch GROUP BY `stadtname` nicht vorkommen.
Warum probierst Du es denn nicht einfach aus?!

Gruss Dr Dau
 
Ich würde das ganze DB Layout ändern!
Vorausgesetzt du hast in der Tabelle wirklich nur ID und Stadtname!

Tablelayout:
id
stadtname
count

Irgendwo wird das ganze ja eingetragen. Wenn ich jetzt als User komme und "Berlin" als Beispiel eintragen möchte, überprüfst du zuerst ob dieser Eintrag bereits vorhanden ist, wenn ja inkrementier mitels UPDATE den Wert von 'count'. Ist "Berlin" noch nicht in der DB, so mach INSERT und setze den Wert von 'count' auf 1.

Bei der Auslehse musst du dann nur noch Stadtname und den zugehörigen Wert von 'count' auslehsen!
 
Zurück