具有复杂计数的Multiset MySQL查询

时间:2015-01-30 13:42:36

标签: php mysql

我有两张桌子。一个表基于"标识符"存储用户的元数据,该标识符是用于标识访问者的唯一字符串。

另一个表存储网站的每个匹配,以及是否设置了操作。 "动作"可以是正常的"查看","下载"或者" 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的总和
  •   
  • 此日期内电子邮件总数的总和
  •   
  • 此日期内总观看次数的总和
  •   
  • 此日期内总印数的总和
  •   

1 个答案:

答案 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