Динамическая сводная таблица mysqli и PHP - PullRequest
0 голосов
/ 09 мая 2018

Я немного переживаю, когда mysqli и PHP используют динамическую сводную таблицу, так как я могу получить статическую сводную таблицу на PHP, но не динамическую.

Я построил динамический сводный свод в MySQL Workbench, и он отлично выглядит и отлично работает.

Workbench Screenshot

Борьба заключается в PHP, так как я пытался запросить multi или оператор, оба не удаются, так как я понимаю, что multi-query не рекомендуется, но я застрял на данный момент.

как видите код, который я написал для 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');

1 Ответ

0 голосов
/ 09 мая 2018

Это должно быть проще, чем вы делаете. Вам не нужно использовать PREPARE и EXECUTE в текстовом протоколе. И нет необходимости запрашивать INTO @sql в 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";
}
...