Seite 1 von 2

Datum absteigend sortieren / Ignorieren von Leerfeldern

Verfasst: 16.12.2006 21:59
von Akschel
Hallo,

ich habe folgende Frage:
In meinem Forum ( http://axel.perschmann.info ) habe ich eine Geburtstagsfunktion hinzugemoddet. In der Mitgliederliste besteht nun die Möglichkeit die Mitglieder nach Geburtsdatum zu sortieren.
Wenn ich Aufsteigend sortiere ist das alles kein Problem, nun hätt ich aber gern beim Absteigend sortieren, dass die Nutzer ohne Gebursdatum (Deren Datenbank-Geburtsdatumswert (user_birthday) wird per Mod auf '999999' festgelegt) ignoriert werden und erst nach Usern mit Datum angezeigt werden.

So sieht es immoment aus:
-Kein Geburtsdatum
-10.10.2000
-10.10.1900

Und so möcht ich es haben:
-10.10.2000
-10.10.1900
-Kein Geburtsdatum

So sieht der entsprechende Sortierbefehl im Code aus

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
Es steht deutlich sichtbar noch nichts davon da, dass er User ohne Geburtsdatum ignorieren und erst an den Schluss stellen soll. Wie gebe ich diesen entsprechenden Befehl? Ich vermute mal es ist am einfachsten ihm zu sagen, er soll erst die User mit Geburstagsdatenbankwert ungleich 999999 (Also kein Geburtsdatum) sortieren und danach die Restlichen User mit Wert 999999 auflisten.

Da ich aber nicht so der php-Profi bin, wäre es recht net, wenn mir das jemand schreiben könnte :)

Verfasst: 17.12.2006 17:20
von bgx
Du müsstest bei der SQL abfrage folgendes dabeischreiben:

Code: Alles auswählen

WHERE user_birthday <> 999999
Dann sollte es klappen!

Verfasst: 17.12.2006 17:43
von S2B
Aber dann fehlen die Benutzer ohne eingegebenen Geburtstag.

Ich würde das ganze per PHP lösen: Zwei Arrays anlegen, das erste mit den Benutzern mit Geburtstag und das zweite mit den Benutzern ohne Geburtstag füllen. Dann die beiden Arrays in der richtigen Reihenfolge kombinieren (array_merge()) und ausgeben.
Eine Alternative wäre auch, das ganze mit 2 separaten Queries zu lösen.

Verfasst: 17.12.2006 18:31
von Xwitz
Man kann auch erst alle mit WHERE <> und dann noch mal mit = ausgeben.

OT: @ Akschel, ne ziemlich breite Zielgruppe hast Du da. :lol:

Verfasst: 17.12.2006 19:41
von Akschel
S2B hat geschrieben:Aber dann fehlen die Benutzer ohne eingegebenen Geburtstag.

Ich würde das ganze per PHP lösen: Zwei Arrays anlegen, das erste mit den Benutzern mit Geburtstag und das zweite mit den Benutzern ohne Geburtstag füllen. Dann die beiden Arrays in der richtigen Reihenfolge kombinieren (array_merge()) und ausgeben.
Eine Alternative wäre auch, das ganze mit 2 separaten Queries zu lösen.
Xwitz hat geschrieben:Man kann auch erst alle mit WHERE <> und dann noch mal mit = ausgeben.
Wie genau schreib ich das dann in den Code? Bin noch nicht so großartig Bewandert mit php.

So im groben Zusammengefasst:
Gesamtliste = User <> 999999 + danach User = 999999
Könnt mir da jemand den fertigen Code dazu sagen?
so vielleicht?

Code: Alles auswählen

case 'birthday':
      WHERE user_birthday <> 999999
      {
      $order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
      break;
      }
      AND WHERE user_birthday = 999999
      {
      $order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
      break;
      }

Xwitz hat geschrieben:OT: @ Akschel, ne ziemlich breite Zielgruppe hast Du da. :lol:
Meinst vom Alter der User her? ;)
Najo dürfte daran liegen, dass der Testuser 83 is :D :D
Aber wenn mal langsam alle angemeldet sind geht die Spanne trotzdem von 15 bis 55 :o

Verfasst: 18.12.2006 10:06
von Xwitz
Also WHERE ist schon mal ein SQL-Befehl den man mit php übergibt, den php aber selber nicht kennt (nehme ich an 8) ).

Das $order_by = "..." sieht aber schon mal nach SQL aus, also sollte es vermutlich auch da rein. (An der Sortierung habe ich noch nie was gemacht.)


Öhm, ich sehe gerade, daß mit den zwei Abfragen ist nicht so einfach einzubauen, weil in dem case nur der String zusammengebaut wird. Der zweite Durchlauf müßte irgendwie zusätzlich rein.

Dann besser in einem Rutsch. Einfach mal abwarten, was hier rauskommt: http://www.phpbb.de/viewtopic.php?t=138172 (Edit: mein Fehler, daß würde hier nicht helfen) Ich melde mich wieder.

Edit 2:

Erst mal zurück zum alten order_by, also:

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
weiterhin suche:

Code: Alles auswählen

$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
ersetze mit:

Code: Alles auswählen

if ($mode == 'birthday')
{
$sql = "(SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday <> 999999 
	ORDER BY $order_by) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday = 999999 
	ORDER BY $order_by) LIMIT $start, " . $board_config['topics_per_page'];
}
else
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
}
Der else-Teil ist das Original und bei birthday gibt es die Sonderbehandlung. Ich hoffe es funktioniert, getestet habe ich es nicht.

edit 3 (14:28Uhr): Code korrigiert, LIMIT "über alles" hinzugefügt.

Verfasst: 18.12.2006 15:19
von Akschel
Hab nen kleinen Fehler noch bei dir gefunden
Und zwar steh bei dir in deiner

Code: Alles auswählen

$sql = "(SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
kein user_birthday drin. Bei mir heißt es nun

Code: Alles auswählen

$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
Dann kommt aber folgende Fehlermeldung :o
Could not query users

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, use' at line 5

SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar FROM phpbb_users WHERE user_id <> -1 AND user_birthday <> 999999 ORDER BY user_birthday ASC LIMIT 0, 50) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar FROM phpbb_users WHERE user_id <> -1 AND user_birthday = 999999 ORDER BY user_birthday ASC LIMIT 0, 50) LIMIT 0, 50

Line : 169
File : memberlist.php
:-?

Insgesamt sieht das so aus:

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
	default:
		$order_by = "user_regdate $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
}

if ($mode == 'birthday')
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar

	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday <> 999999
	ORDER BY $order_by) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
	FROM " . USERS_TABLE . "
	   WHERE user_id <> " . ANONYMOUS . " AND user_birthday = 999999
   ORDER BY $order_by) LIMIT $start, " . $board_config['topics_per_page'];
}
else
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
    FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
	}

Verfasst: 18.12.2006 15:42
von Xwitz
Das user_birthday, war in meiner memberlist.php nicht drin, daher. :oops:

Zum Fehler, im wahren Pfad von if fehlt die öffnende Klammer vor dem SELECT (in meinem Code-Schnipsel ist sie drin).

Verfasst: 18.12.2006 15:49
von Akschel
[ externes Bild ]

Ich Idiot :-? Danke dir nun tuts einwandfrei :-D

Wenn ich das gleiche noch mit diversen anderen Feldern wie Beispielsweise das Website Feld machen möchte schreib ich einfach so:

Code: Alles auswählen

if ($mode == 'birthday')  .....
if ($mode == 'website') .....
else .....
oder?

Verfasst: 18.12.2006 15:52
von S2B

Code: Alles auswählen

if ($mode == 'birthday')  .....
else if ($mode == 'website') .....
else .....
:wink: