Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] nur kleinstem wert einer person anzeigen mittels MIN?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] nur kleinstem wert einer person anzeigen mittels MIN?

    hallo zusammen

    aufgabenstellung:
    ich möchte aus einer mysql-tabelle mit personen, die alle mehrmals darin vorkommen, nur den datensatz mit dem kleinsten wert anzuzeigen.

    Tabelle:
    +-------+------+-----+--------+------+
    | person | wert | rang | distanz | ort_id |
    +-------+------+-----+--------+------+
    | markus (1) | 130 | 1 | 2500 | 12 |
    | peter (2) | 135 | 5 | 2100 | 13 |
    | franzi (3) | 140 | 3 | 2500 | 12 |
    | markus (1) | 230 | 2 | 2000 | 14 |
    | peter (2) | 175 | 1 | 2100 | 15 |
    | franzi (3) | 240 | 3 | 2000 | 14 |
    +-------+------+-----+--------+------+

    Soll-Resultat:
    +-------+------+-----+--------+------+
    | person | wert | rang | distanz | ort_id |
    +-------+------+-----+--------+------+
    | markus (1) | 130 | 1 | 2500 | 12 |
    | franzi (3) | 140 | 3 | 2500 | 12 |
    | peter (2) | 135 | 5 | 2100 | 13 |
    +-------+------+-----+--------+------+

    als lösung dachte ich, dass man das mit "min" und "group by" machen kann.
    wichtig ist aber, dass ich neben der spalte "wert" auch die daten der anderen spalten benötige. und genau da ist das problem.

    meine abfrage:
    PHP-Code:
    mysql_query("select person, min(wert) as wertMin, rang, distanz, ort from rangierung group by person"
    das liefert mir zwar die person nur 1x und auch der "wert" stimmt (der kleinste), aber bei alle anderen spalten werden nicht die des entsprechenden datensatzes angezeigt sondern irgend ein anderer:

    Ist-Resultat (falsch):
    +-------+------+-----+--------+------+
    | person | wert | rang | distanz | ort_id |
    +-------+------+-----+--------+------+
    | markus (1) | 130 | 2 | 2000 | 14 |
    | franzi (3) | 140 | 3 | 2500 | 12 |
    | peter (2) | 135 | 1 | 2100 | 15 |
    +-------+------+-----+--------+------+

    wo lieft das problem? ist "min" überhaupt der richtige ansatz?
    danke für eure hilfe

  • #2
    http://jan.kneschke.de/projects/mysql/groupwise-max

    Kommentar


    • #3
      Was die Spalte "person" in Deinem Beispiel enthält, habe ich nicht verstanden. Ich habe mal ein ähnliches Beispiel zusammen gestellt:

      Code:
      CREATE TABLE personen (
       person_id INT NOT NULL,
       wert INT NOT NULL,
       rang INT NOT NULL,
       distanz INT NOT NULL,
       ort_id INT NOT NULL
      );
      
      INSERT INTO personen VALUES
      ( 1, 130, 1, 2500, 12 ),
      ( 2, 135, 5, 2100, 13 ),
      ( 3, 140, 3, 2500, 12 ),
      ( 1, 230, 2, 2000, 14 ),
      ( 2, 175, 1, 2100, 15 ),
      ( 3, 240, 3, 2000, 14 );
      
      SELECT p1.person_id, p1.wert, p1.rang, p1.distanz, p1.ort_id
        FROM personen p1
        JOIN ( SELECT p2.person_id, MIN(p2.wert) wert
                 FROM personen p2
                GROUP BY p2.person_id
             ) p2
          ON p2.person_id = p1.person_id
         AND p2.wert = p1.wert
      ORDER BY person_id;
      
      +-----------+------+------+---------+--------+
      | person_id | wert | rang | distanz | ort_id |
      +-----------+------+------+---------+--------+
      |         1 |  130 |    1 |    2500 |     12 |
      |         2 |  135 |    5 |    2100 |     13 |
      |         3 |  140 |    3 |    2500 |     12 |
      +-----------+------+------+---------+--------+
      3 rows in set (0.40 sec)
      
      mysql>
      Grüße
      Thomas

      Kommentar


      • #4
        besten dank für eure antworten!
        das mit der person ist schon eine id (dachte mit namen sei das einfacher zu erklären).
        melde mich wieder ob ich es hinbekommen habe.

        Kommentar


        • #5
          das scheint auf den ersten blick zu funktionieren... (bei 4500 datensätzen brauch ich aber noch einen zweiten blick).

          ein problem war noch, dass die spalte "wert" manchmal auch leer resp. 0.00 war. das ist kein minimalwert sondern ganz einfach nicht definiert und somit auch nicht im ergebnis auftauchen durfte.

          folgender massen gelöst:
          PHP-Code:
          SELECT p1.person_idp1.wertp1.rangp1.distanzp1.ort_id FROM personen p1 JOIN SELECT p2.person_idMIN(p2.wertwert FROM personen p2 where p2.wert !='0.00' GROUP BY p2.person_id p2 ON p2.person_id p1.person_id AND p2.wert p1.wert ORDER BY person_id 

          Kommentar

          Lädt...
          X