[英]Mysql dynamic pivoting and groupoing
昨天跟进我的问题
我有一张桌子1
Remark Name Points
----------------------
Cameroon SS 10
Cameroon JL 10
NZ JL 30
我想显示为
NZ Cameroon
---------------------
JL 10 10
SS 0 30
备注中table1的条目是动态的,将添加更多。
我在Php中尝试的是
$query_get = "SELECT DISTINCT remark FROM table1";
$result = mysql_query($query_get) or die(mysql_error());
$remarks ='';
while ($row = mysql_fetch_array( $result )) {
$remarks .= ",SUM( IF( remark={$row[0]}, 1, 0 ) ) as {$row[0]} ";
};
$query = "SELECT name, .$eventcodes. FROM jr_event_points";
$result1 = mysql_query($query) or die(mysql_error());
现在错误来自查询。 动态列汇总后,应该如何进行第二次查询?
您可以使用动态SQL在MySQL方面做到这一点
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('COALESCE(SUM(CASE WHEN remark = ''',
remark,
''' THEN points END), 0) `',
remark,
'`'))
INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT name, ', @sql, ' FROM table1 GROUP BY name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
输出:
| NAME | CAMEROON | NZ | |------|----------|----| | JL | 10 | 30 | | SS | 10 | 0 |
这是SQLFiddle演示
如果我想用php做,有可能吗?
$sql = "
SELECT GROUP_CONCAT(DISTINCT CONCAT('COALESCE(SUM(CASE WHEN remark = ''',
remark,
''' THEN points END), 0) `',
remark,
'`')) columns
FROM table1";
$result = mysql_query($sql);
if (!$result) {
die ('Error: ' . mysql_error()); //TODO: better error handling
}
$row = mysql_fetch_assoc($result);
$sql = "SELECT name, {$row['columns']} FROM table1 GROUP BY name";
$result = mysql_query($sql);
if (!$result) {
die ('Error: ' . mysql_error()); //TODO: better error handling
}
$row = mysql_fetch_assoc($result);
echo '| '. implode(' | ', array_keys($row)) . ' |' . PHP_EOL;
echo '| '. implode(' | ', array_values($row)) . ' |' . PHP_EOL;
while ($row = mysql_fetch_assoc($result)) {
echo '| '. implode(' | ', array_values($row)) . ' |' . PHP_EOL;
}
输出:
| name | Cameroon | NZ | | JL | 10 | 30 | | SS | 10 | 0 |
注意:请考虑从mysql_*
切换到mysqli_*
或PDO
因为自PHP 5.5.0起不推荐使用此扩展,以后将删除该扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.