1

私の現在のSQLは次のようになります-

SELECT i.id, 
       i.name,
       i.description,
       c.name campaign,
       count(h.id) hits
FROM items i 
LEFT JOIN campaigns c ON c.id = i.campaignid
LEFT JOIN links l ON l.itemid = i.id
LEFT JOIN hits h ON h.linkid = l.id
GROUP BY i.id

これを変更して、h.id の count() で 6 番目の列が返されるようにしますが、過去 30 日間の「ヒット」のみが含まれるようにします。したがって、全体で 100 件の「ヒット」があり、過去 30 日間で 50 件の「ヒット」があったと仮定すると、5 番目の列は 100 になり、6 番目の列は 50 になります。

私の説明がかなり冗長である場合は申し訳ありません...

4

3 に答える 3

4
SELECT i.id, 
       i.name,
       i.description,
       c.name campaign,
       count(h.id) hits,
       COUNT( CASE WHEN h.hitdate >= CURDATE() - INTERVAL 29 DAY
                     THEN h.hitdate 
                     ELSE NULL
              END
            ) AS last_30_days_hits
FROM ...

より短いものを使用できます(ただし、必ずしも高速であるとは限りません):

       SUM( h.hitdate >= CURDATE() - INTERVAL 29 DAY )
         AS last_30_days_hits
于 2012-12-28T23:51:09.870 に答える
0

where句を追加できるはずです no? 線に沿った何か...

WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= h.hitdate

h.hitdate は、ヒット レコードの日時フィールドになります。タイムスタンプを使用している場合は、単純に where h.hitdate >= (time() - 2592000) を計算します。

于 2012-12-28T23:53:45.617 に答える
0

次のように、ON 句または WHERE 句のいずれかに 30 日フィルターを追加できます。

LEFT JOIN hits h ON h.linkid = l.id AND h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)

また

WHERE h.hitdate >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)
于 2012-12-29T00:40:41.320 に答える