[英]Mysql dynamic pivoting and groupoing
Following up on my question yesterday 昨天跟进我的问题
I have a table1 我有一张桌子1
Remark Name Points
----------------------
Cameroon SS 10
Cameroon JL 10
NZ JL 30
I want to display it as 我想显示为
NZ Cameroon
---------------------
JL 10 10
SS 0 30
the entries of table1 in remark are dynamic and more will be added. 备注中table1的条目是动态的,将添加更多。
What i am trying in Php is 我在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());
Now the error comes at query. 现在错误来自查询。 how should i proceed for second query once i have dynamic column summed up? 动态列汇总后,应该如何进行第二次查询?
You can do it on MySQL side with dynamic SQL 您可以使用动态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;
Output: 输出:
| NAME | CAMEROON | NZ | |------|----------|----| | JL | 10 | 30 | | SS | 10 | 0 |
Here is SQLFiddle demo 这是SQLFiddle演示
If i want to do it by php, is it possible? 如果我想用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;
}
Output: 输出:
| name | Cameroon | NZ | | JL | 10 | 30 | | SS | 10 | 0 |
Note: consider to switch from mysql_*
to mysqli_*
or PDO
since this extension is deprecated as of PHP 5.5.0, and will be removed in the future. 注意:请考虑从mysql_*
切换到mysqli_*
或PDO
因为自PHP 5.5.0起不推荐使用此扩展,以后将删除该扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.