【问题标题】:selecting values dynamic from columns using pivoting mysql使用透视 mysql 从列中动态选择值
【发布时间】:2013-11-04 09:56:20
【问题描述】:

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

下面是他们的架构

品牌

brands_id,友好,简短,追随者,创建,位置,brandID, 处理,网址,图片,utcOffset,帖子,约定,参与用户, 等(足够当前问题)

帖子

post_id、brandID、postID、handle、posted、content、postType、cmets、 等(足以满足当前问题)

其中 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 or PHP Turning rows into columns dynamically

MySQL pivot table query with dynamic columns

提前致谢!!

【问题讨论】:

  • 你不能用 MySQL 用一个查询来做到这一点。
  • @TomMac 没问题。如果我使用子查询或连接来完成这项工作,那很好
  • 只需组装一个 GROUPed 和 ORDERed 结果并在应用程序级别处理显示逻辑(例如一点 PHP)。你也可以使用 sproc,但我不喜欢这个主意。

标签: php mysql database dynamic pivot


【解决方案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 - 给 EXECUTE 的未知准备语句处理程序 (stmt)”消息在 phpMyAdmin 中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多