2

連絡先に連絡がなかった時期を通知し、カレンダーでその日を強調表示するコードが少しあります。つまり、昨日その人に最後に連絡した場合は、強調表示された日が次の月のページの1か月後に表示されます。

私がやりたいのは、1年まで毎月それをすることです。したがって、前の例では、強調表示された日を1か月超えて移動した場合、「2か月間連絡がない」、3か月、4か月、つまり4番目から12か月になります。

これが、「1か月間連絡がない」クエリに現在使用しているものです。

SELECT DATE_FORMAT(DATE(DATE_ADD(date, INTERVAL 1 MONTH)), '%Y-%c-%d') AS overDate
    FROM contact_method_history
WHERE DATE(DATE_ADD(date, INTERVAL 1 MONTH)) = '$SQLDate'
AND entityRef = ".$this->entityId."
ORDER BY date DESC
LIMIT 1

$ this-> entityIdは、153や9045のようなもので、連絡先への単なる参照です。

$SQLDateは「2012-05-09」の形式です。

4

1 に答える 1

0

コメントに同意しません。ループを実行すると、1つではなく12のクエリが実行されるため、パフォーマンスが低下します。一方、「オールインワン」クエリのステートメントは簡単ではありません。

SELECT date
, i.m
, DATE_FORMAT(DATE(DATE_ADD(cmh.date, INTERVAL i.m MONTH)), '%Y-%c-%d') AS overDate
FROM contact_method_history AS cmh
, (
    SELECT 1 as m
    UNION ALL SELECT 2 as m
    UNION ALL SELECT 3 as m
    UNION ALL SELECT 4 as m
    UNION ALL SELECT 5 as m
    UNION ALL SELECT 6 as m
    UNION ALL SELECT 7 as m
    UNION ALL SELECT 8 as m
    UNION ALL SELECT 9 as m
    UNION ALL SELECT 10 as m
    UNION ALL SELECT 11 as m
    UNION ALL SELECT 12 as m
) AS i
WHERE ( DATE(DATE_ADD(cmh.date, INTERVAL i.m MONTH)) = '$SQLDate' )
AND (entityRef = ".$this->entityId.")
GROUP BY i.m, DATE(DATE_ADD(cmh.date, INTERVAL i.m MONTH))
于 2012-05-09T09:23:01.653 に答える