SQL: Wie ordne ich nach einem Feld, wenn es nicht Null ist, sonst verwende ein anderes Feld

8

Ich möchte meine Posts von dtModified (datetime modified) sortieren, wenn es nicht null ist (post modified b4), sonst nach dtPosted sortieren (datetime posted)

    
Jiew Meng 31.07.2010, 11:21
quelle

3 Antworten

5

Es sieht so aus, als ob ich diesen Rat drei Mal die Woche hier auf SO gebe, vielleicht sollte ich einfach aufgeben und loslassen :-) Nein, das glaube ich nicht:

Verwenden Sie nicht pro Zeile Zeilenfunktionen in Ihren Spaltenberechnungen (oder order by -Klauseln), wenn Ihre Datenbank gut skalieren soll. Sie sollten die Leistung für Ihren speziellen Fall überprüfen ( messen, nicht raten ), aber das Ausführen von Berechnungen, wenn Lesen die Datenbank beeinflusst, wirkt sich in der Regel auf Ihre Skalierbarkeit aus (dies spielt keine Rolle) für Ihre Adressbuch-Datenbank, aber die Geschäfte, in denen ich arbeite, haben riesige Datenmengen.

Die Anzahl der "Wie bekomme ich meine DB schneller?" Fragen überwiegen bei weitem die Anzahl von "Wie verwende ich weniger Platz?" Einsen. Es ist ein ausgetretener Pfad, um Speicherplatz für die Leistung zu opfern.

Der richtige Zeitpunkt für Berechnungen ist, wenn sich die Daten ändern. Auf diese Weise werden die Kosten der Änderungen über alle Lesevorgänge hinweg amortisiert.

Ich rate dazu, eine weitere Spalte wie dtLastAction anzulegen, um den Bestellwert zu enthalten. Verwenden Sie dann einen Einfüge- / Aktualisierungstrigger, um ihn auf dtModified wenn nicht null oder dtPosted falls dtModified zu setzen Null. Technisch gesehen verstößt dies gegen 3NF, aber das ist in Ordnung, wenn Sie wissen, was Sie tun, und die Trigger garantieren in diesem Fall die Datenkonsistenz.

Dann indexieren Sie die Spalte dtLastAction und sehen Sie, wie sich die Geschwindigkeit Ihrer Abfragen zu den (geringeren) Kosten für zusätzliche Arbeit bei Einfügungen und Aktualisierungen verbessert. Ich sage weniger, weil die große Mehrheit der Datenbanktabellen öfter gelesen wird als geschrieben (offensichtlich ist diese Methode nutzlos, wenn Ihre spezielle Situation eine der seltenen Ausnahmen ist).

Alternativ können Sie für diesen speziellen Fall dtModified und dtPosted auf denselben Wert setzen, wenn Sie den Eintrag erstellen, dh dtModified wird niemals sein null. Sie können immer noch Posts erkennen, die noch nie geändert wurden, da diese beiden Datetime-Werte identisch sind.

    
paxdiablo 31.07.2010, 12:01
quelle
13

Sie können COALESCE verwenden:

%Vor%

Eine weitere Option ist die Verwendung der MySQL-spezifischen Funktion IFNULL anstelle von COALESCE .

Testen auf MySQL:

%Vor%

Ergebnisse:

%Vor%     
Mark Byers 31.07.2010 11:24
quelle
0

Verwenden Sie in Ihrer SELECT-Anweisung eine CASE-Anweisung, die den Wert des geänderten Datums übernimmt, wenn nicht null, andernfalls das Datum der Veröffentlichung. Verwenden Sie dann diese neue "berechnete" Spalte für Ihre ORDER BY.

    
RWGodfrey 31.07.2010 11:30
quelle

Tags und Links