tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
575
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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.
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    $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).
    Geändert von Joe (21.11.11 um 18:22 Uhr) Grund: Ergänzungen wegen logischen Fehler :)
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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
    Joe bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    Herzlichen Dank damit bin ich ein für mich beinahe unlösbaren Schritt weitergekommen.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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
    Geändert von Joe (21.11.11 um 20:33 Uhr) Grund: Code leserlicher formatiert
     

  4. #4
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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)

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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.
     

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.
    Joe bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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?
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Er sortiert schon. Aber er sortiert den Wert False (ist glaub 0) und True (ist glaub -1)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. MySQL - ORDER BY nach eigenem Text
    Von Pinky im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 28.09.11, 15:54
  2. Mysql 5 Unknown column 'af.artikel_nummer' in 'on clause'
    Von aTa im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 02.06.10, 11:05
  3. MySQL - Bei ORDER BY leere Felder nach hinten
    Von suntrop im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 15.01.10, 10:55
  4. MYSQL Version 5 Problem, Unknown column 'p.manufacturers_id' in 'on clause'
    Von liquidbeats im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 05.07.07, 22:49
  5. [MySQL] Column Alias in WHERE clause?
    Von Romsl im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 22.02.07, 20:15