0

MySQL Workbench を使用して、次の動的ピボットが動作しています。ただし、PHPを使用して実行する際に問題があります。過去7日間、たくさん試しましたが、うまくいきません。これを実行するには、PHP コードがどのようなものであるべきかを理解する必要があります。

SET @sql = NULL;
SET group_concat_max_len=15000;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'COUNT(IF(int_supplierid = ',
      int_supplierid,
      ', int_projectid, NULL)) AS NO',
      int_supplierid
    )
  ORDER BY int_supplierid) INTO @sql
FROM tbl_po;
SET @sql = CONCAT('SELECT int_userid, ', @sql, ' FROM tbl_po GROUP BY int_userid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

私が使用した最初のphpコード。

<?php
require_once('myconn.php');

$approval="SET @sql = NULL;
SET group_concat_max_len=15000;"

$approval3="
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'COUNT(IF(int_supplierid = ',
      int_supplierid,
      ', int_projectid, NULL)) AS NO',
      int_supplierid
    )
  ORDER BY int_supplierid) INTO @sql
FROM tbl_po;
SET @sql = CONCAT('SELECT int_userid, ', @sql, ' FROM tbl_po GROUP BY int_userid');
PREPARE stmt FROM @sql;
EXECUTE stmt;"

$RSFeed2 = mysql_query($approval) or die(mysql_error());
$RSFeed2 = mysql_query($approval3) or die(mysql_error());
$totalRows_RSFeed = mysql_num_rows($RSFeed2);
echo $RSFeed2['int_userid'];
echo $totalRows_RSFeed;
?>

私が使用して試した2番目のもの。

$host="127.0.0.1";
$port=3306;
$socket="";
$user="root";
$password="pwd";
$dbname="kelupis";

$con = new mysqli($host, $user, $password, $dbname, $port, $socket)
    or die ('Could not connect to the database server' . mysqli_connect_error());

//1st query
$query1 = "SET @sql = NULL;
SET group_concat_max_len=15000; SELECT   GROUP_CONCAT(DISTINCT     CONCAT('COUNT(IF(int_supplierid = ',int_supplierid,', int_projectid, NULL)) AS NO',int_supplierid)   ORDER BY int_supplierid) INTO @sql FROM tbl_po;";


if ($stmt = $con->prepare($query1)) {
    $stmt->execute();
    $stmt->bind_result($int_supplierid);
    while ($stmt->fetch()) {
        printf("%s\n", $int_supplierid);
    }
}
4

1 に答える 1

0

PHP の mysql API はマルチクエリをサポートしていません。

つまり、セミコロンで区切られた複数の SQL ステートメントを含む文字列を準備して実行することはできません。

同様に、mysqli はプレーンな mysqli::query() 関数によるマルチクエリをサポートしていません。mysqli::multi_query()を使用する必要があります。

しかし、マルチクエリは本当に悪い考えです。ステートメントを 1 つずつ実行することに固執する必要があります。

PS: PHP 5.3.0 の時点で mysql 拡張機能は非推奨になっているため、新しいコードでは mysqli または PDO を使用する必要があります。


あなたの例から、動的ピボットを実行しようとしていることがわかります。各サプライヤー ID に対して 1 つの列が必要であり、列の値はそのサプライヤー ID の数である必要があります。

これらのカウントを列ではなく行として出力する方がはるかに簡単で効率的です。

$query = "SELECT int_supplierid, COUNT(int_projectid) 
    FROM tbl_po GROUP BY int_supplierid";

if (!($stmt = $con->prepare($query))) {
    die($con->error);
}
if (!$stmt->execute()) { 
    die($stmt->error); 
}
$stmt->bind_result($int_supplierid, $no);
while ($stmt->fetch()) {
    printf("%s: %d\n", $int_supplierid, $no);
}
于 2013-01-22T06:13:46.303 に答える