使用pivoting mysql从列中选择动态值

时间:2013-10-25 10:20:10

标签: php mysql database dynamic pivot

我有一个品牌表和帖子表。

以下是他们的架构

品牌

  

brands_id,友好,简短,粉丝,创建,位置,brandID,   handle,url,pic,utcOffset,posts,engagements,engagedUser,   等(足以满足当前的问题)

帖子

  

post_id,brandID,postID,handle,posted,content,postType,comments,   等(足以满足当前的问题)

其中postType =链接,状态,视频,问题,民意调查等

现在我使用以下查询进行了硬编码:

select b.friendly,
sum(case when p.postType='link' then 1 else 0 end)  as 'link',
sum(case when p.postType='video' then 1 else 0 end)  as 'video',
sum(case when p.postType='status' then 1 else 0 end)  as 'status',
sum(case when p.postType='photo' then 1 else 0 end)  as 'photo',
count(p.postType) 
from brands b, posts p 
where b.handle 
in ('chevroletcanada','dodgecanada') 
    and p.handle=b.handle
    and date(p.posted) 
BETWEEN "2013-06-02" and "2013-08-11" 
group by b.friendly

但是在上面的查询中我静态地使用了postType类型,即链接,状态,视频,照片。现在,如果将新的postType添加到posts表中,这将不起作用,因为我也必须更改查询。此外,如果删除了postType中的现有值,则还必须再次更改查询。

我的问题是如何动态实现这一点,以便在posts表中添加例如tweet的新postType值时,推文也会显示在结果集中。删除任何postType都是一样的。

如果您不明白问题,请通知我。

我已阅读以下帖子,但无法弄清楚:

MySQL or PHP Turning rows into columns dynamically

MySQL pivot table query with dynamic columns

提前致谢!!

1 个答案:

答案 0 :(得分:1)

这是针对上述问题的解决方案。动态支点可以这样实现:

SET @sql = NULL;

  SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when postType = ''',
      postType,
      ''' then 1 end) as `', 
      postType, '`')
  ) INTO @sql
FROM posts; 
SET @sql = CONCAT('SELECT b.friendly, count(p.postType), ', @sql, ' from brands b, posts p where b.handle in ("dodgecanada","chevroletcanada") and p.handle=b.handle
and date(p.posted) BETWEEN "2004-08-11" and "2013-09-11" group by b.friendly');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

以上查询在SQL界面HeidiSQL中显示正确的结果。但是回报: #1243 - 未知的预处理语句处理程序(stmt)给出了phpMyAdmin中的EXECUTE消息

有谁能告诉我为什么会这样? Mysql中不支持“准备好”语句吗?或者在phpMyAdmin中运行预准备语句是否存在任何问题。 我如何在phpMyAdmin中克服这个问题?谁能告诉我如何在PHP中执行此操作?谢谢!