Sortieren anhand einer Bedingung

DiDiJo

Erfahrenes Mitglied
Hi Leute,

ich bastle gerade an einer Immobiliensuche und wollte gerade die Sortierung komplett umwerfen.

Vorher wurde immer absteigend nach dem Erstellungsdatum der Immobilie gesucht. Nun wollte ich das ganze System so umstellen, so dass, je nachdem auf welcher Homepage ich mich befinde, erst die Objekte des Homepagebesitzers erscheinen und danach die Objekte von anderen Maklern. Dafür habe ich in der Immobiliendatenbank das Feld "Anbieternummer" die einer Immobilie einen Makler zuweist.

Nun hatte ich mir überlegt, ich könnte 2 Selects ausführen und die erzeugte Arrays per array_merge zusammenführen. Allerdings weiß ich nicht wie ich die Limit Reglung anstellen soll, wenn meine Objektsuche immer nur 10 Objekte pro Seite ausspuckt.

Mal angenommen ich habe 15 Objekte die zu den Suchkriterien passen. Dann darf das 2. Select nur ab der 2. Seite ausgeführt werden. Das ist zwar alles machbar aber meiner Meinung nach viel zu kompliziert. Vor allem wenn ich noch eine Seite weiter wechsle, dann darf das Select erst da beginnen wo es auf der von der 2. Seite aufgehört hat.

Meine 2. Idee sieht wie folgt aus. Ich meine mich erinnern zu können, dass man in einer SELECT Anweisung ein IF-Kunstrukt einbauen kann aber irgendwie will das bei mir gerade gar nicht.

So schauts momentan aus:
Code:
SELECT im.*,b.pfad,s.global, IF (`im.anbieternr` = '1445') as `im.myOrder` 
FROM immobilien im, immobilien_mls_settings s, anhaenge b 
WHERE 
im.objektnr_extern=b.objektnr_extern AND 
im.objektnr_extern=s.objektnr_extern AND 
b.gruppe='TITELBILD'
ORDER BY im.myOrder, im.geaendert_um DESC LIMIT 0, 10

Kann mir da vlt. einer von euch weiterhelfen ... egal ob zu dem 2. Select oder bei dem allgemeinen Problem ... vlt. kriege ich das ja auch viel einfacher gelösst und habe bis jetzt einfach zu kompliziert gedacht.

mfg DiDi
 
Zuletzt bearbeitet:
Du kannst es ganz einfach machen.

SQL:
SELECT *
FROM Tabelle
ORDER BY anbieternummer=1445 DESC, geandert_um DESC
LIMIT 0,20

Also "anbieternummer=1445" wird zu true/false (in MySQL zu 1/0) ausgewertet. Also komme erst alle Treffer, welche dort eine 1 haben (also meine) und innerhalb diesen nach dem Datum sortiert. Und danach alle die dort eine 0 haben und dort innerhalb ebenfalls nach dem Datum.
 
man das es so einfach ist hätte ich auch nicht gedacht ... ich war gerade dabei ein CASE WHEN END Kontrukt mir zurechtzufummeln ... deine Lösung ist aber um einiges hübscher ....

Vielen dank ... da habe ich mal wieder was gelernt
 
das Ergebniss sieht zwar super aus ... aber kann es sein, dass nun die Ergebnisse nach der Anbieternummer gruppiert werden ? Ich hab nicht das Gefühl, dass die "fremden Immobilien" absteigend nach dem Änderungsdatum sortiert werden
 
Zeig mal dein jetztiges Query. Also wie du die Lösung von CPoly in dein SQL integriert hast.
 
das ist mein query:
Code:
SELECT im.*,b.pfad,s.global FROM immobilien im, immobilien_mls_settings s, anhaenge b WHERE im.objektnr_extern=b.objektnr_extern AND im.objektnr_extern=s.objektnr_extern AND (s.global=1 OR (s.global=0 AND im.anbieternr='1445')) AND b.gruppe='TITELBILD' AND im.anbieternr NOT IN('260', '277', '348', '551', '813', '913', '997', '1073', '1294', '413') AND im.anbieternr != 961 AND im.sichtbar = 1 ORDER BY im.anbieternr='1445' DESC, im.geaendert_um DESC LIMIT 0, 10

Hier noch ein Link für die Ergebnisse:
Klick

Die Objektnummer setzt sich aus ANIBITERNUMMER-OBJEKTNUMMER zusammen. Normalerweise ist es nicht üblich, dass die ganzen Objekte alle in einem Block hintereinander stehen
 
Wo liegt jetzt das Problem? Ich dachte du wolltest, dass zuerst alle Immobilien von (in dem Fall) '1445' und danach alle anderen angezeigt werden? Und innerhalb dieser beiden Blöcke nach dem Datum? Für mich sieht das auf der Seite so aus.

War das das Ziel und wenn ja, was davon trifft nicht zu?
 
So, hier mal das SQL formatiert, damit man auch ein Hauch einer Chance hat das ganze zu verstehen
SQL:
SELECT 
	im.*,
	b.pfad,
	s.global 
FROM 
	immobilien im,
	immobilien_mls_settings s,
	anhaenge b 
WHERE 
	im.objektnr_extern=b.objektnr_extern 
	AND im.objektnr_extern=s.objektnr_extern 
	AND (s.global=1 OR 
		(s.global=0 AND im.anbieternr='1445')) 
	AND b.gruppe='TITELBILD' 
	AND im.anbieternr NOT IN('260','277','348','551','813','913','997','1073','1294','413') 
	AND im.anbieternr != 961 
	AND im.sichtbar = 1 
ORDER BY 
	im.anbieternr='1445' DESC,
	im.geaendert_um DESC 
LIMIT 0, 10

Ansonsten geb ich CPoly recht, das sit doch das was du beschrieben hast.

Achja, das 'AND im.anbieternr != 961' kannst du streichen, wenn du die 961 in dein IN()-Liste schreibst.
 
Zuletzt bearbeitet von einem Moderator:
Also ich muss mich eben entschuldigen weil ich zu vorschnell war.

Normalerweise tauchen die Objekte immer recht unsortiert auf (nach zuletzt geaendert (nicht nach erstellt wie zuerst angenommen)). Da nun aber bis zur Seite 10 (ca.) die Objekte in Anbieter-Blöcken erscheinen (erkennbar an der Objektnummer (der erste teil ist die Anbieternummer)) war ich ein wenig verwundert.

Ich habe aber eben alles überprüft und scheinbar haben einige Makler einen Vollabgleich vollzogen und deshlab tauchen die Objekte nun in diesen seltsamen Blöcken auf. Das ist aber auch vollkommen in Ordnung.

Ich war gerade nur ein wenig verwundert .... Sorry nochmal für die Umstände ... und danke für die HIlfe

Edit: ja das Query ist ein wenig katastrophal weil es dynamisch aufgebaut wird je nachdem auf welcher Seite ich mich befinde. Bei dieser Homepage wurden einige Makler ausgeblendet und so entstand diese NOT IN Anweisung
 
Zuletzt bearbeitet:
Zurück