Manu: Nach max(created) filtern...

Hallo zusammen,

ich stehe hier gerade etwas auf de Schlauch oO. Für ein Projekt auf MySQL-Basis (V5) möchte ich in einem Subselect nach dem neuesten Datum (timestamp) sortieren - bisher dachte ich immer, das würde mit having funktionieren. Tut es aber nicht, ich bekomme keinen Datensatz zurück.

Ohne den Filter auf created (HAVING max(created)) bekomme ich zuviele Daten; hier speichere ich zum Nachvollziehen jede Statusänderung.

Die Query schaut im Moment so aus:

SELECT objects.id AS id, 0 AS relevance
FROM (
 SELECT id
 FROM (
  SELECT DISTINCT(object)
  FROM \_order\_prop\_status AS valuetable
  WHERE (value IN (
   SELECT DISTINCT(object)
   FROM \_status\_object\_prop\_status AS valuetable
   WHERE (value = 11) HAVING max(created))))
AS tmptable LEFT JOIN \_order AS objects ON objects.id=tmptable.object WHERE NOT ISNULL(objects.id) AND ISNULL(objects.deleted)) AS objects LEFT JOIN \_order\_prop\_date ON (\_order\_prop\_date.object=objects.id AND ISNULL(\_order\_prop\_date.deleted)) ORDER BY \_order\_prop\_date.value DESC LIMIT 20

Hat jemand eine Idee für mich?

Gruß,
Manu

  1. Ups, hier fehlte noch das GROUP BY object

    Gruß,
    Manu

  2. Hallo

    ich stehe hier gerade etwas auf de Schlauch oO.

    und läßt die potentiellen Helfer ebenfalls auf einem Schlauch stehen.

    Ohne den Filter auf created (HAVING max(created)) bekomme ich zuviele Daten; hier speichere ich zum Nachvollziehen jede Statusänderung.

    Die Query schaut im Moment so aus:

    [...] nutzlose Query gelöscht. [...]

    Hat jemand eine Idee für mich?

    Beispieltabellen mit Beispieldatensätzen und dem gewünschten Resultat wäre viel hilfreicher als ein Statement, das nicht die gewünschten Resultate liefert. Es scheint mir jedoch, dass Du das ganze viel zu kompliziert angehst. Wahrscheinlich dürfte ein korreliertes Subselect das sein, was Du suchst.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      mit Beispieltabellen wirds etwas schwierig; mein Vorgänger hat die Normalisierung so weit getrieben, dass jedes Attribut in einer eigenen Tabelle steht - hier 10 Tabellen zu posten wird den Rahmen sprengen.
      (Um 'Tipps' hierzu vorzubeugen: nein, das DB-Layout wird nicht geändert ;))

      Ein (weiteres) Subselect habe ich gestern schon angefangen - es haperte noch ein wenig mit der Implementierung, aber es sollte klappen...

      Generell zu having:
      Ich habe eine Tabelle mit WERT | TIMESTAMP | OBJECT, jedes Objekt kann mehrere Werte haben; den letzten Eintrag sollte ich doch mit
      select object from mytable group by object having max (timestamp)
      bekommen?

      Gruß,
      Manu

      1. yo,

        mein Vorgänger hat die Normalisierung so weit getrieben, dass jedes Attribut in einer eigenen Tabelle steht - hier 10 Tabellen zu posten wird den Rahmen sprengen.

        hat meiner meinung nach mit normalisierung nur wenig zu tun nud ich würde es auch als falsch betrachten.

        Ich habe eine Tabelle mit WERT | TIMESTAMP | OBJECT, jedes Objekt kann mehrere Werte haben; den letzten Eintrag sollte ich doch mit
        select object from mytable group by object having max (timestamp)
        bekommen?

        das ist eine falsche annahme. du benutzt am besten eine korrelierte unterabfrage, deren timestamp mit den max(timestamp) des jeweiligen objektes (korrelation) gegen geprüft wird. in deinem falle:

        SELECT m1.object
        FROM mytable m1
        WHERE m1.timestamp = (SELECT MAX(m2.timestamp)
                              FROM mytable m2
                              WHERE m2.object = m1.Object
                             )
        ;

        Ilja