0

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

下面是他们的架构

品牌

brand_id、friendly、short 、followers、created、location、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 中的现有值被删除,则也必须再次更改查询。

我的问题是如何动态地实现这一点,以便在帖子表中添加新的 postType 值(例如 tweet)时,tweet 也会显示在结果集中。删除任何 postType 也是如此。

如果您还没有理解问题,请告诉我。

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

MySQL或PHP动态将行变成列

具有动态列的 MySQL 数据透视表查询

提前致谢!!

4

1 回答 1

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 中显示正确的结果。但在 phpMyAdmin 中返回:#1243 - Unknown Prepared statement handler (stmt) given to EXECUTE”消息

谁能告诉我为什么会这样?Mysql不支持'prepared'语句吗?或者 phpMyAdmin 运行准备好的语句是否有任何问题。如何在 phpMyAdmin 中克服这个问题?谁能告诉我如何在 PHP 中做到这一点?谢谢!!

于 2013-10-30T07:50:16.710 回答