[MySQL] Order by Clause nach naheliegensten Position

Joe

Erfahrenes Mitglied
Hallo Tutorials

Ich suche nach einem Order By Statement welches mir die naheliegensten Positionen sortiert ausgibt. Ich stehe jetzt bloss ein wenig auf dem Schlauch wie das aussehen müsste.
SQL:
$getFoundSammelplatz = "SELECT
							SammelplatzID,
							Username
						FROM
							FoundSammelplatz
						WHERE
							Username='$Username'";
$result = mysql_query($getFoundSammelplatz);
if(mysql_num_rows($result) != 0) {
	while ($row = mysql_fetch_assoc($result)) {
		$SammelplatzID=$row["SammelplatzID"];
		$getSammelplatz = "SELECT
				SammelplatzID,
				Ressource,
				ScrapX,
				ScrapY,
				Menge
			FROM
				Sammelplatz
			WHERE
				SammelplatzID= $SammelplatzID
			ORDER BY 
				ScrapX='$PosX'
				AND
				ScrapY='$PosY'";
		$result1 = mysql_query($getSammelplatz);

Ich denke ohne Join wird das ganze garnicht gehen.
Noch zur kurzen Erklärung: $PosX und $PosY sind unveränderliche Fixpunkte der User sowas wie die Hauptzentrale. Gesucht wird eine Liste nächstliegender Ressourcen nach ScrapX und ScrapY (veränderlich und begrenzt auf 15).
 
Zuletzt bearbeitet von einem Moderator:
item: Du mischt da ORDER BY und WHERE. Alles was vergleicht gehört nie und nimmer in den ORDER BY Teil

item: Jepp, ein Join währe nützlich
SQL:
SELECT
	sp.*
FROM
	FoundSammelplatz AS fsp
	INNER JOIN Sammelplatz AS sp
		ON fsp.SammelplatzID = sp.SammelplatzID
WHERE
	fsp.Username='{$Username}'
    AND ScrapX='{$PosX}'
    AND ScrapY='{$PosY}'
ORDER BY 
	--TODO: Sortierfelder Kommasepariert auflisten
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Joe
Herzlichen Dank damit bin ich ein für mich beinahe unlösbaren Schritt weitergekommen.

SQL:
SELECT
	sp.*		
FROM
	FoundSammelplatz AS fsp
INNER JOIN Sammelplatz AS sp
	ON fsp.SammelplatzID = sp.SammelplatzID
WHERE
	fsp.Username='{$Username}'
ORDER BY 
	sp.ScrapX='{$PosX}',
	sp.ScrapY='{$PosY}'
DESC


Nun muss mir nur noch was wegen der Sortierung einfallen.
Bei dieser ORDER BY Position 100/100 kommt folgendes heraus:
Kleine Edelsteinefabrik mit 13848 Edelsteine auf Position 102/100
Steinhaufen mit 9991 Stein auf Position 102/97
Plastikfabrik mit 15290 Plastik auf Position 101/102
Eisenhaufen mit 9939 Eisen auf Position 103/101
Rest Edelmetall mit 3880 Edelmetall auf Position 100/100
Rest Sand mit 3687 Sand auf Position 100/105
Grosser Stahlhaufen mit 11286 Stahl auf Position 100/99
Holzhaufen mit 8698 Holz auf Position 100/106
Grosser Uranhaufen mit 10694 Uran auf Position 100/102
Ölfabrik mit 15033 Öl auf Position 100/85

Eigentlich müsste der Sammelplatz mit 100/100 als erstes in der Liste stehen und 100/85 als letztes.


Aber wie immer vielen Dank für deine Hilfe :)
 
Zuletzt bearbeitet von einem Moderator:
item: Du mischt da ORDER BY und WHERE. Alles was vergleicht gehört nie und nimmer in den ORDER BY Teil
Ok das war mir bisher nicht bewusst. MySQL selbst hat kein Fehler geworfen.

Also ich denke es nach einer bestimmten Position X/Y zu ordnen dürfte einiges schwieriger werden. Habe es daher so ordnen lassen das die User selbst in der Lage sind die nheliegensten Plätze zu finden. (Man kann die Plätze aus der Liste nehmen zumeist vermutlich die am weitesten entfernten Plätze)

SQL:
SELECT
	sp.*		
FROM
	FoundSammelplatz AS fsp
INNER JOIN Sammelplatz AS sp
	ON fsp.SammelplatzID = sp.SammelplatzID
WHERE
	fsp.Username='{$Username}'
ORDER BY 
	sp.ScrapX ASC,
	sp.ScrapY ASC

Das erzeugt:
Ölfabrik mit 15033 Öl auf Position 100/85
Grosser Stahlhaufen mit 11286 Stahl auf Position 100/99
Rest Edelmetall mit 3880 Edelmetall auf Position 100/100
Grosser Uranhaufen mit 10694 Uran auf Position 100/102
Rest Sand mit 3687 Sand auf Position 100/105
Holzhaufen mit 8698 Holz auf Position 100/106
Plastikfabrik mit 15290 Plastik auf Position 101/102
Steinhaufen mit 9991 Stein auf Position 102/97
Kleine Edelsteinefabrik mit 13798 Edelsteine auf Position 102/100
Eisenhaufen mit 9939 Eisen auf Position 103/101

Also recht übersichtlich und daher auch ausreichend. Danke Yaslaw.
 
Zuletzt bearbeitet von einem Moderator:
Wie geschrieben '100=90' im ORDER BY wirft keinen Fehler. Aber er sortiert nicht nahc der Zahl sondern nach dem Resultat. Und das ist bei '100=90' also FALSE.
Darum wirft die MySQL keinen Fehler.
 
  • Gefällt mir
Reaktionen: Joe
Achso verstehe in diesem Fall 'False' sortiert er nicht wirklich.

Hatte mich vor deinem Post selbst versucht mit einen Left Join (Hatte erstmal wenig Erfolg). Gab es einen bestimmten Grund weshalb ein Inner Join näher liegt?
 
Er sortiert schon. Aber er sortiert den Wert False (ist glaub 0) und True (ist glaub -1)

Code:
Tabelle
VALUE
-----
12345 
67890
23456

order by Value
12345 
23456
67890

order by Value LIKE '23*"
VALUE SORT_VALUE (VALUE LIKE '23*')
---------------
23456  TRUE
12345  FALSE
67890  FALSE
 

Neue Beiträge

Zurück