【问题标题】:Dynamic Pivot Table mysqli and PHP动态数据透视表 mysqli 和 PHP
【发布时间】:2018-05-09 15:56:40
【问题描述】:

在动态数据透视表上使用 mysqli 和 PHP 时我有点挣扎,因为我能够在 PHP 中获得静态数据透视表,但不是动态数据透视表。

我在 MySQL Workbench 中构建了一个动态 Pivot,它看起来不错,而且运行完美。

斗争是 PHP,因为我试图查询多或语句,两者都失败了,因为我理解不推荐多查询,但我现在卡住了。

你可以看到我为 PHP 编写的代码

function get_all_records() {
    $conn = getdb();
    $Sql = "SET @sql = NULL;";
    $Sql .= "SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(suo.date = ''', date, ''', suo.units_ordered, 0)) AS ', CONCAT('`',date,'`') ) ) INTO @sql FROM tbl_sku_units_order;";
    $Sql .= "SET @sql = CONCAT('SELECT ls.sku AS list_sku, 
    COALESCE(MIN(suo.sku), 'NotSold' )  AS sold_sku,  
    ', @sql, ' , 
    COALESCE( SUM(suo.units_ordered), 0 ) AS total_sold 
     FROM   tbl_list_sku AS ls
           LEFT JOIN tbl_sku_units_order AS suo 
                  ON suo.sku = ls.sku 
    GROUP  BY ls.sku 
    ORDER  BY total_sold DESC');";

    $Sql .="PREPARE stmt FROM @sql;";
    $Sql .="EXECUTE stmt;";
    $Sql .="DEALLOCATE PREPARE stmt;";

  $result = mysqli_multi_query($conn, $Sql);
   if (mysqli_num_rows($result) > 0) {

       while ($row = mysqli_fetch_assoc($result)) {
           echo "<tr>
   <td>" . $row['list_sku'] . "</td>
    <td>" . $row['today_sold'] . "</td></tr>";
           }
        //  echo "<tr> <td><a href = '' class = 'btn btn-danger' id = 'status_btn' data-loading-text = 'Changing Status..'>Export</a></td></tr>";
        echo "</tbody></table></div>";
   } else {
       echo "<P class = 'text-center'>You have no recent QTY Daily Inventory</P>";
    }
}

它根本不起作用。 我也喜欢将 Workbench 工具导出到 PHP 代码,但缺少大部分重要功能

$query = "SELECT GROUP_CONCAT(DISTINCT  CONCAT(         'MAX(IF(suo.date = ''',         date,       ''', suo.units_ordered, 0)) AS ',       CONCAT(\"`\",date,\"`\")    ) ) INTO @sql FROM tbl_sku_units_order";


if ($stmt = $conn->prepare($query)) {
    $stmt->execute();
    $stmt->bind_result($date);
    while ($stmt->fetch()) {
        printf("%s\n", $date);
    }
    $stmt->close();

因为这个缺失的功能是

SET @sql = CONCAT('SELECT ls.sku AS list_sku, 
    COALESCE( MIN(suo.sku), "Not Sold" )  AS sold_sku,  
    ', @sql, ' , 
    COALESCE( SUM(suo.units_ordered), 0 ) AS total_sold 
     FROM   tbl_list_sku AS ls
           LEFT JOIN tbl_sku_units_order AS suo 
                  ON suo.sku = ls.sku 
    GROUP  BY ls.sku 
    ORDER  BY total_sold DESC');

【问题讨论】:

标签: php mysql mysqli pivot-table


【解决方案1】:

这应该比你做的更容易。您不需要在文本协议中使用 PREPARE 和 EXECUTE。并且无需在 SQL 中查询INTO @sql。只需在 PHP 代码中格式化查询并执行它。

// expand the expression so it's easier to see if parens are balanced
$Sql = "
  SELECT GROUP_CONCAT(DISTINCT 
    CONCAT(
      'MAX(IF(suo.date = ''', date, ''', suo.units_ordered, 0)) AS `', date, '`'
    )
  ) 
  FROM tbl_sku_units_order;";
$gc_result = $conn->query($Sql);
// always check for errors
if (!$gc_result) {
  echo "ERROR in SQL: $Sql\n{$conn->error}\n";
}
$gc_row = $gc_result->fetch_row();
$pivot_columns = $pivot_row[0];

// and check if this string is empty,
// because there might be no data to pivot
if (!$pivot_columns) {
    $pivot_columns = 'NULL';
}

$Sql = "
  SELECT ls.sku AS list_sku, 
  COALESCE(MIN(suo.sku), 'NotSold') AS sold_sku,  
  $pivot_columns,
  COALESCE(SUM(suo.units_ordered), 0) AS total_sold 
  FROM tbl_list_sku AS ls
  LEFT JOIN tbl_sku_units_order AS suo 
    ON suo.sku = ls.sku 
  GROUP BY ls.sku 
  ORDER BY total_sold DESC";
$pivot_result = $conn->query($Sql);
// always check for errors
if (!$pivot_result) {
  echo "ERROR in SQL: $Sql\n{$conn->error}\n";
}

【讨论】:

  • 抱歉没有回复您,感谢您的代码,但是,错误是“$gc_row = $result->fetch_row(); 上的“调用成员函数 fetch_row()” "所以我调整了“$gc_row = $gc_result->fetch_row();”还是一样,但我会四处寻找这个错误。
  • 我修复了您的 SQL 中的几个语法错误,例如第一个查询中的括号过多。提示:每次运行 SQL 查询时,请检查结果是否不是 false。如果是,则记录$conn-&gt;error,因为这会告诉您错误是什么。我在您的操场示例中留下了错误检查代码。顺便说一句,既然您已经将密码放到了互联网上,那么您应该更改密码。 :-)
  • 好吧,这个 SQL 是操场,因为它不真实,因为我要离开它几天然后我会把它取下来,我注意到操场上没有任何变化。抱歉给您带来麻烦。
  • 好的,我在上面的答案中对代码进行了编辑。查看代码中的 cmets。
  • 感谢您的更新,似乎它已显示,但所有组都在一起,我现在正在处理它。找到将日期分成列的方法,如您所见phpfiddle.org/main/code/b7tm-46rt
猜你喜欢
  • 1970-01-01
  • 2014-10-16
  • 2010-12-28
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多