2

これは初心者のphp/mysqlの質問です。私は何時間もさまざまなループをいじりましたが、目標を達成することができませんでした。dbに2つのテーブルがあります。1つは本を含み、もう1つは本の在庫情報を含みます。このような:

id  title
1   A book
2   Another book
3   A third book

および在庫(book_stock)

id  book_id   warehouse_id   qty
1   1         1              12
2   1         2              45
3   2         3              22
4   3         1              78
5   1         3              15

テーブルを読み取り、bookテーブルのidをstockテーブルのbook_idと照合してから、htmlテーブルに要約を出力し、本のタイトルと、さまざまな倉庫に存在する各本の数を示します。私がこれまでに試したことは、mysqlリクエストをループすることです。これは、結果を出力しないためにクラッシュするようです。解決策はシンプルでアレイが関係していると感じていますが、私のスキルは不足しています...

これが私の機能しないコードです。この関数は、手動で入力された1、2、さらには20の結果に対しても正常に機能しますが、ループした場合にのみ空白のテーブルセルを出力します。

//function to get stock based on book id number
function get_stock($book_row_number)
{
    //get BOOK from db
    $book_query="SELECT * FROM book";
    $book_result=mysql_query($book_query);

    //determine book info
    $book_id=mysql_result($book_result,$book_row_number,"id");
    $book_title=mysql_result($book_result,$book_row_number,"title");

    //get LONDON stock for this book from db
    $stock_query="SELECT qty FROM book_stock WHERE book_id='$book_id' AND warehouse_id='1'";
    $stock_result=mysql_query($stock_query);
    $stock_london=mysql_result($stock_result,0,"qty");

    //get USA stock for this book from db
    $stock_query="SELECT qty FROM book_stock WHERE book_id='$book_id' AND warehouse_id='2'";
    $stock_result=mysql_query($stock_query);
    $stock_usa=mysql_result($stock_result,0,"qty");

    //get GERMANY stock for this book from db
    $stock_query="SELECT qty FROM book_stock WHERE book_id='$book_id' AND warehouse_id='4'";
    $stock_result=mysql_query($stock_query);
    $stock_germany=mysql_result($stock_result,0,"qty");

    echo "<tr><td>$book_title</td><td>$stock_london</td><td>$stock_usa</td><td>$stock_germany</td></tr>\n";
}

//find number of rows in book list
$all_query="SELECT * FROM book";
$all_result=mysql_query($all_query);
$all_rows=mysql_numrows($all_result);

// run the function on all the rows
$i=0;
while ($i < $all_rows) {
    get_stock('$all_rows');
    $i++;
}

編集:そして今のコード

<?php

//set up connection
$user="username";
$password="paswd";
$database="database";
mysql_connect("localhost",$user,$password);
@mysql_select_db($database) or die( "Unable to select database");

//query
$book_query="SELECT
book_id,
title,
SUM(CASE WHEN warehouse_id = 1 THEN book_stock.qty ELSE 0 END) AS warehouse1,
SUM(CASE WHEN warehouse_id = 2 THEN book_stock.qty ELSE 0 END) AS warehouse2,
SUM(CASE WHEN warehouse_id = 3 THEN book_stock.qty ELSE 0 END) AS warehouse3,
SUM(CASE WHEN warehouse_id = 4 THEN book_stock.qty ELSE 0 END) AS warehouse4
FROM
book_stock
JOIN book ON book.id = book_stock.book_id
GROUP BY book_id, title";

//loop
$result = mysql_query($book_query);
if ($result) {
  while ($row = mysql_fetch_assoc($row)) {
    echo "<tr><td>" . htmlspecialchars($row['title']) . "</td><td>{$row['warehouse1']}</td><td>{$row['warehouse2']}</td><td>{$row['warehouse3']}</td><td>{$row['warehouse4']}</td></tr>";
  }
}
else echo mysql_error();



//close database
mysql_close();
?>
4

1 に答える 1

1

ピボットテーブルとして作成する場合は、単一のクエリでこれを行うことができます。集計では、一致するSUM()場合はの値を加算し、各行で一致しない場合は0を加算して、すべてのウェアハウスを1つの行にまとめます。qtywarehouse_id

SELECT
  SUM(CASE WHEN warehouse_id = 1 THEN qty ELSE 0 END) AS warehouse1,
  SUM(CASE WHEN warehouse_id = 2 THEN qty ELSE 0 END) AS warehouse2,
  SUM(CASE WHEN warehouse_id = 3 THEN qty ELSE 0 END) AS warehouse3,
  SUM(CASE WHEN warehouse_id = 4 THEN qty ELSE 0 END) AS warehouse4
FROM
  book_stock
WHERE book_id = $book_id

の場合book_id = 1、これにより次のような結果が生成されます。

warehouse1 warehouse2 warehouse3 warehouse4
       12        45          15          0

GROUP BY行のすべての本で取得するには、 :を追加します。

SELECT
  book_id,
  title,
  SUM(CASE WHEN warehouse_id = 1 THEN qty ELSE 0 END) AS warehouse1,
  SUM(CASE WHEN warehouse_id = 2 THEN qty ELSE 0 END) AS warehouse2,
  SUM(CASE WHEN warehouse_id = 3 THEN qty ELSE 0 END) AS warehouse3,
  SUM(CASE WHEN warehouse_id = 4 THEN qty ELSE 0 END) AS warehouse4
FROM
  book_stock
  JOIN book ON book.id = book_stock.book_id
GROUP BY book_id, title

PHPからの出力は、簡単なwhileループになります。

// Assuming you already opened your <table>
$result = mysql_query($the_big_query_above);
if ($result) {
  while ($row = mysql_fetch_assoc($result)) {
    echo "<tr><td>" . htmlspecialchars($row['title']) . "</td><td>{$row['warehouse1']}</td><td>{$row['warehouse2']}</td><td>{$row['warehouse3']}</td><td>{$row['warehouse4']}</td></tr>";
  }
}
else echo mysql_error();

// Then don't forget to close your </table>
于 2012-09-01T21:14:00.563 に答える