Tabelle sortieren

kevkev

Erfahrenes Mitglied
Hallo,

Ich habe in einer MySQL DB mehrere Datensätze drinnen.
Wenn Ich nun z.b. nach "name" sortieren möchte, mache Ich das mit Order By.
In der MySQL Datenbank ist aber noch ein Wert, nach dem Ich sortieren möchte, der aber erst ausgerechnet werden muss.

D.h. Ich müßte alle Datensätze in ein Array schmeißen.
Beim reinschmeißen errechne Ich dann diesen Wert.

Dann hätte Ich dann folgendes Array:
[name] => "josef"
[123] => "456"
(..)

usw.

Das mache Ich dann in einer Schleife.

Nun zur Ausgabe:
Wie kann Ich denn nun, z.b. im array nach dem Wert "name" sortieren lassen?
Man sollte aufsteigend und absteigend sortieren lassen können.

Weiß jemand wie Ich das am besten mache?

Gruß Kevin
 
Du kannst zum einen [phpf]usort[/phpf] verwenden.
Möglich ist aber die Berechnung und damit auch die Sortierung des Werts direkt im Query.

Wie berechnet sich der Wert denn?

Gruß hpvw
 
Hi,

Die Berechnung geht so:
Spalte 1: ratingcount
Spalte 2: ratings
Spalte 3: name
Spalte 4: straße
(...)

Die Berechnung wäre dann ratingcount / ratings.
Und nach dem errechneten Wert würde dann sortiert werden.

Aber wie genau rechnet man direkt in dem Query?

Gruß Kevin
 
Ein Beispiel, erraten aus Deinen Angaben:
SQL:
select
  `name`,
  `straße`,
  `ratingcount`,
  `ratings`,
  (`ratingcount` / `ratings`) as `ratingCountPerRatings`
from tabelle
order by `ratingCountPerRatings`
Ich bin mir gerade nicht sicher, ob nach Aliasfeldern sortiert werden kann, ggf. musst Du den Ausdruck im order by wiederholen.

Gruß hpvw
 
Hi,

Danke hat funktioniert :)!

Wenn Ich die Daten per GET Übergebe, finde Ich das recht unsicher.
Hättest du eine Idee wie man das für die user eher "unsichtbar" machen kann?

Z.b. mit base64 verschlüßeln ^^ !

Und Zurzeit ist das bei mir im Code ziemlich ein durcheinander:
PHP:
if (!isset($_GET["order"])) {
    $_GET["order"] = "bericht";
}

if (!isset($_GET["by"])) {
    $_GET["by"] = "DESC";
}

if ($_GET["by"]=="1") {
	$order_by = "2";
	$order_by_mysql = "DESC";
	$sort_img = "arrow-sort-up.gif";
} else {
	$order_by = "1";
	$order_by_mysql = "ASC";
	$sort_img = "arrow-sort-down.gif";
}

		echo "<table class=\"firma_bericht_table\">";
		echo "<tr>";
			echo "<td class=\"firmen_bericht_top\" width=\"400px\">";

				if ($_GET["order"]=="bericht") {
				    echo "<b>Sortiert nach:</b><br>";
				} else {
					echo "Sortieren nach:<br>";
				}

				echo "<a href=\"?site=".$_GET["site"]."&id=".$_GET["id"]."&order=bericht&by=".$order_by."\"><b>Bericht</b></a>";

				if ($_GET["order"]=="bericht") {
				    echo "<img src=\"./img/".$sort_img."\" border=\"0\">";
				}
			echo "</td>";

			echo "<td class=\"firmen_bericht_top\">";
			if ($_GET["order"]=="ratingCountPerRatings") {
				    echo "<b>Sortiert nach:</b><br>";
				} else {
					echo "Sortieren nach:<br>";
				}

				echo "<a href=\"?site=".$_GET["site"]."&id=".$_GET["id"]."&order=ratingCountPerRatings&by=".$order_by."\"><b>Bewertungen</b></a>";

				if ($_GET["order"]=="ratingCountPerRatings") {
				    echo "<img src=\"./img/".$sort_img."\" border=\"0\">";
				}
			echo "</td>";


			echo "<td class=\"firmen_bericht_top\">";
				if ($_GET["order"]=="datum") {
				    echo "<b>Sortiert nach:</b><br>";
				} else {
					echo "Sortieren nach:<br>";
				}

				echo "<a href=\"?site=".$_GET["site"]."&id=".$_GET["id"]."&order=datum&by=".$order_by."\"><b>Datum</b></a>";

				if ($_GET["order"]=="datum") {
				    echo "<img src=\"./img/".$sort_img."\" border=\"0\">";
				}
			echo "</td>";
		echo "</tr>";

		$sql = mysql_query("SELECT * , (`ratingcount` / `ratings`) AS `ratingCountPerRatings` FROM berichte WHERE firmen_id = '".$_GET["id"]."' ORDER BY ".$_GET["order"]." ".$order_by_mysql."");

Geht es auch einfacher?

Gruß Kevin
 
Zuletzt bearbeitet:
Hi,

Hab Ich mir auch schon gedacht, aber falls der User die URL weitergeben will, soll die Sortierung beibehalten werden.
Das ist bei POST nicht der Fall.

Bei base64_encode() wird der Text:
datum|DESC
in sowas encodiert:
ZGF0dW18REVTQw==

Wäre das sinnvoll?

Gruß Kevin
 
Von welchen Daten sprichst Du?

Du hast doch selber schon nach SQL Injection gefragt. Gumbo hat Dich da auf einen Thread hingewiesen, in dem unter anderem von mir ein Beispiel zum richtigen maskieren steht.

Wenn es Dir um das Übergeben der Sortierung geht, kannst Du das über eine eigene Abfrage lösen. Beispiel:
PHP:
$order=(isset($_GET['order']))?$_GET['order']:'name';
switch ($order) {
    case 'ratings':
        $order='`ratings`';
        break;
    case 'ratingCountPerRatings':
        $order='`ratingCountPerRatings`';
        break;
    //...
    default:
        $order='`name`';
}
$sql='select ... order by '.$order;
Gruß hpvw

EDIT:
kevkev hat gesagt.:
Bei base64_encode() wird der Text:
datum|DESC
in sowas encodiert:
ZGF0dW18REVTQw==

Wäre das sinnvoll?
Ich sehe darin keinen Sinn.
 
Hi,

Ahhh genau!
Jetzt fällts mir ein. Also auf meinem Apache werden alle ' und " automatisch geqoted :)!
Danke ^^.

Bei:
$order=(isset($_GET['order']))?$_GET['order']:'name';
macht das:
?$_GET['order']:'name'

Doch keinen Sinn, da falls in switch keine Überstimmung ist, automatisch doch default: genommen wird, oder?

Danke, werde das dann auch mit switch machen.

Noch eine Frage:
Kann Ich, wenn Ich aus einer Funktion ein Array erhalte, das direkt ansprechen?
z.b.:

echo (explode("|", $txt)[0]);

Ich würde da ein Array zurückbekommen, und will direkt auf [0] zugreifen.

Geht das direkt?

Gruß Kevin
 
Zuletzt bearbeitet:
kevkev hat gesagt.:
Bei:
$order=(isset($_GET['order']))?$_GET['order']:'name';
macht das:
?$_GET['order']:'name'

Doch keinen Sinn, da falls in switch keine Überstimmung ist, automatisch doch default: genommen wird, oder?
Die Überprüfung dient in erster Linie dazu, abzufangen, ob der Wert per Get übergeben wurde, damit keine Fehlermeldung beim Zugriff auf die Variable kommt. Zugegebenermaßen hätte ich für die Variable einen anderen Namen wählen sollen. Sinnvoll wäre natürlich auch, den Default-Wert nur im Switch zu definieren und hier statt 'name' einen leeren String zu übergeben. Aber es war ja auch nur ein Beispiel...

kevkev hat gesagt.:
Noch eine Frage:
Kann Ich, wenn Ich aus einer Funktion ein Array erhalte, das direkt ansprechen?
z.b.:

echo (explode("|", $txt)[0]);

Ich würde da ein Array zurückbekommen, und will direkt auf [0] zugreifen.
Da bin ich mir nicht sicher, aber probieren geht über studieren.

Gruß hpvw
 
Zurück