這是一個使用CROSS JOIN的替代方案。首先,使用TIMESTAMPDIFF函數和相應的參數(DAY/WEEK/MONTH/YEAR)計算時差。然後,如果計數等於1,則該值相加。最後,CROSS JOIN由包含句點名稱的內聯視圖組成。
SELECT
periods.period,
CASE periods.period
WHEN '1_day' THEN totals.1_day
WHEN '7_days' THEN totals.7_days
WHEN '1_month' THEN totals.1_month
WHEN '1_year' THEN totals.1_year
END total
FROM
(
SELECT
SUM(CASE days WHEN 2 THEN 1 ELSE 0 END) 1_day,
SUM(CASE weeks WHEN 1 THEN 1 ELSE 0 END) 7_days,
SUM(CASE months WHEN 1 THEN 1 ELSE 0 END) 1_month,
SUM(CASE years WHEN 1 THEN 1 ELSE 0 END) 1_year
FROM
(
SELECT
TIMESTAMPDIFF(YEAR, FROM_UNIXTIME(like_date), NOW()) years,
TIMESTAMPDIFF(MONTH, FROM_UNIXTIME(like_date), NOW()) months,
TIMESTAMPDIFF(WEEK, FROM_UNIXTIME(like_date), NOW()) weeks,
TIMESTAMPDIFF(DAY, FROM_UNIXTIME(like_date), NOW()) days
FROM likes
) counts
) totals
CROSS JOIN
(
SELECT
'1_day' period
UNION ALL
SELECT
'7_days'
UNION ALL
SELECT
'1_month'
UNION ALL
SELECT
'1_year'
) periods
您是否需要通過'like_user_id'或'like_post_id'對此進行聚合,或者只需要返回所有記錄的計數,就像您的示例輸出顯示的那樣? –
什麼起點是決定的時間段?他們是否必須是行或者交叉表查詢是否適合您?這是一個用戶ID還是全部? –
我需要通過'like_post_id'進行聚合。開始時間:從1年前到當前日期時間。 – Dmitry