2016-07-27 11 views
1

Ich möchte latest_date aus einer Datenbank, die zwischen 3 Daten Feld ist. Jetzt verwende ich die folgende Abfrage, aber es ist nicht ok für meine Anforderung. Wie zu vergleichen 3 Datumsfeld zu erhalten latest_date?Mysql Vergleich drei Datetime Felder

SELECT DISTINCT e.id, MAX(cc.updated) AS clinicComment_date, MAX(af.created) AS attenderInfo_created, e.updated AS event_updated, 
(
CASE 
WHEN MAX(cc.updated) > MAX(af.created) 
THEN MAX(cc.updated) 
WHEN MAX(cc.updated) < MAX(af.created) 
THEN MAX(af.created) 
ELSE e.updated 
END 
) AS latest_date 
FROM Event e 
LEFT JOIN EventClinic ec ON e.id = ec.event_id 
LEFT JOIN ClinicComment cc ON ec.clinic_id = cc.clinic_id 
LEFT JOIN AttendersInfo af ON af.event_id = e.id 
WHERE e.status = 'active' 
AND (
e.id =43 
OR e.id =45 
) 
GROUP BY e.title 
ORDER BY latest_date DESC 

Dank

Antwort

1

ich glaube, Sie GREATEST() Funktion

GREATEST(cc.updated, af.created, e.updated) AS latest_date 

THis ein Sie

Wenn Sie die neueste zwischen allen das letzte Datum für eine einzelne Zeile sollte geben können Zeilen:

MAX(GREATEST(cc.updated, af.created, e.updated)) AS latest_date 

, die gleich zu tun

GREATEST(MAX(cc.updated), MAX(af.created), MAX(e.updated)) AS latest_date 

Um mit NULL Werten Sie COALESCE

GREATEST(
    COALESCE(MAX(cc.updated), 0), 
    COALESCE(MAX(af.created), 0), 
    COALESCE(MAX(e.updated), 0) 
) AS latest_date 

Oder

MAX(
    GREATEST(
     COALESCE(cc.updated), 0), 
     COALESCE(af.created), 0), 
     COALESCE(e.updated), 0) 
)) AS latest_date 

das Ergebnis sollte gleich sein, vielleicht können sie unterscheiden sich in Leistung, weiß ich nicht

+0

ich mit dieser Abfrage GREATEST laufen (MAX (cc.updated), MAX (af.created), MAX (e.updated)) AS spätestes_datum aber es gibt ein preblem. Wenn ein Datumsfeld null ist, ist das Datum des letzten Datums null. – kogyikyaw

+0

Wie kann ich für einige Datenfelder mit 'NULL'-Wert tun? – kogyikyaw

+0

so müssen Sie für jede Spalte gegen ISNULL überprüfen und NULL-Werte durch einen anderen Wert ersetzen, ich werde meine Antwort bearbeiten – arilia

0

My SQL hat eine Funktion namens GREATEST(). Sie können die Linien

(
CASE 
WHEN MAX(cc.updated) > MAX(af.created) 
THEN MAX(cc.updated) 
WHEN MAX(cc.updated) < MAX(af.created) 
THEN MAX(af.created) 
ELSE e.updated 
END 
) AS latest_date 

mit GREATEST(MAX(cc.updated), MAX(af.created)) AS latest_date ersetzen und ein drittes Feld, um das hinzuzufügen.

+0

ja, ich versuche mit dieser Abfrage GREATEST (MAX (cc.updated), MAX (af.created), MAX (e.updated)) AS next_date aber es gibt eine Vorproblem. Wenn ein Datumsfeld 'NULL' ist, wäre das letzte_Datum 'NULL'. Wie kann ich für einige Datenfelder mit 'NULL' Wert arbeiten? . – kogyikyaw

0

Ich kann das Problem in Ihrer Case-Anweisung sehen, wo alle Bedingungen nicht erfüllt sind. Mysql bietet GREATEST Funktion größten Wert zurückzukehren

Versuchen Sie, diese

select DISTINCT e.id,GREATEST(MAX(cc.updated),MAX(af.created),e.updated) as Latest_Date 
FROM Event e 
LEFT JOIN EventClinic ec ON e.id = ec.event_id 
LEFT JOIN ClinicComment cc ON ec.clinic_id = cc.clinic_id 
LEFT JOIN AttendersInfo af ON af.event_id = e.id 
WHERE e.status = 'active' 
AND (e.id =43 OR e.id =45) 
GROUP BY e.title 
ORDER BY latest_date DESC