另一个表存储网站的每个匹配,以及是否设置了操作。 "动作"可以是正常的"查看","下载"或者" PDF" (当用户下载PDF时会发生这种情况)。每个页面都是带有post_id的标识符以供参考。
结构:
identifier_meta
- ID
- meta_key
- meta_value
- 标识符
迹线
- ID
- created_at
- 标识符
- IPADDRESS
- 动作
- POST_ID
所以,我想运行一个查询,选择附加到一个或多个" post_ids"的跟踪,按标识符分组并在某个时间戳范围之间。我只想要在" identifier_meta"中存在任何元的记录。我想计算所有的动作(可能是硬编码的,因为只有6个动作:
- 下载
- 下载字
- 下载-PDF
- 视图
- 电子邮件
- 打印
SELECT *
FROM wp_traces
WHERE
identifier IN ( SELECT identifier FROM wp_identifier_meta )
AND
created_at > 0
AND
created_at < 102030502
AND
(
post_id = 1
OR
post_id = 2
)
GROUP BY identifier
ORDER BY created_at
这给了我一些属于某些帖子的特定日期和时间之间的痕迹,但是我错过了结果集中标识符的动作计数......而且我坦率地不知道如何添加它。
理想情况下,我有每行包含
的结果集
- traces.identifier(string)
- identifier_meta.name(字符串(可以为空)
- identifier_meta.company(string)(可以为空)
- traces.created_at(日期最后一次跟踪)
- 在此日期内完全下载的总和
- 此日期内总下载字数的总和
- 在此日期内完成下载-pdf的总和
- 此日期内电子邮件总数的总和
- 此日期内总观看次数的总和
- 此日期内总印数的总和
答案 0 :(得分:0)
听起来您需要将case语句与SUM聚合函数结合使用。像这样的东西。我猜有点,因为我不知道你的数据的确切性质。
SELECT t.identifier,
im.name,
im.company,
t.created_at,
SUM(CASE WHEN meta_value = 'download' THEN 1 ELSE 0 END) AS total_downloads,
SUM(CASE WHEN meta_value = 'download-word' THEN 1 ELSE 0 END) AS total_downloads,
SUM(CASE WHEN meta_value = 'download-pdf' THEN 1 ELSE 0 END) AS total_downloads,
SUM(CASE WHEN meta_value ='email' THEN 1 ELSE 0 END) AS total_downloads,
SUM(CASE WHEN meta_value ='view' THEN 1 ELSE 0 END) AS total_downloads,
SUM(CASE WHEN meta_value ='print' THEN 1 ELSE 0 END) AS total_downloads
FROM wp_traces AS t
JOIN wp_identifier_meta AS im
ON t.identifier = im.identifier
WHERE
t.created_at > 0
AND
t.created_at < 102030502
AND
(
t.post_id = 1
OR
t.post_id = 2
)
GROUP BY t.identifier
ORDER BY created_at