Nach max(created) filtern...
Manu
- datenbank
0 Manu0 Vinzenz Mai
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
Ups, hier fehlte noch das GROUP BY object
Gruß,
Manu
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
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
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