0

total_starsここにコードがあります、それは私がやろうとしていることの最良の説明です:

$total_stars = array();
$query = "SELECT items_id FROM items";
$result = mysql_query($query);

while ($row = mysql_fetch_array($result)) {
    $item_id = $row['items_id'];
    $sql = "Select Count(item_id) FROM ratings WHERE item_id = '{$item_id}'";
    $result = mysql_query($sql);
    $total_stars[] = mysql_fetch_array($result);
}

//  To see the output by entering the URL I want to print_r  
print_r($total_stars);

// In the end, I am trying to JSON encode this and will later output in Java for Android
print(json_encode($total_stars));

(混乱しないように、items_idはitemsテーブルにあり、item_id('s'なし)は評価テーブルにあります)

今、平易な英語で:

アイテムテーブルの各行をループしています。その際、各ループで「評価」と呼ばれる別のテーブルを参照し、そのアイテムの評価の数を取得しています。

たとえば、配列を(65、43、55、43など)のように見せたいとします。もちろんサンプル番号。ただし、それぞれは、テーブル内の各アイテムの評価の合計量を表します。print__rでループ内のSQLステートメントの結果を表示するにはどうすればよいですか?

JOINを使用しようとしている更新されたコード:

$query = "SELECT items_id FROM items";

$q = 'SELECT 
    items.items_id, 
    COUNT(ratings.item_id) AS rate 
    FROM `items`
    LEFT JOIN ratings ON (ratings.item_id = items.items_id)
    GROUP BY items_id';
$result = mysql_query($q);

while ($row = mysql_fetch_array($result)) {

    $total_stars = mysql_fetch_array($result);

}

print_r($total_stars);

print_rはこれを出力します:配列([0] => 783 [items_id] => 783 [1] => 0 [rate] => 0)

4

2 に答える 2

3
$total_stars = array();
while ($row = mysql_fetch_array($result))
{
    $item_id = $row['items_id'];
    $sql = "Select Count(item_id) FROM ratings WHERE item_id = '{$item_id}'";
    $result = mysql_query($sql);
    $row = mysql_fetch_row($result);
    $total_stars[] = row[0];
}

これでうまくいくはずです。

mysql_fetch_arrayが列のインデックスを持つ配列を返すことを忘れないでください。したがって、mysql_fetch_array($ result)は、カウント自体ではなく、(MySQL関数COUNT()からの結果)の最初の要素が必要な配列になります。

ただし、コメントで述べたように、代わりに結合クエリを使用してください。mysqlサーバーへのクエリの量を、最初のクエリ+1の行数(かなりの数になる可能性があります)から1つに減らします。これは、大幅な改善です。

更新:結合クエリ(Svenによるクエリ)を使用してこれを行う方法は次のとおりです。

$q = 'SELECT 
    items.items_id, 
    COUNT(ratings.item_id) AS rate 
    FROM `items`
    LEFT JOIN ratings ON (ratings.item_id = items.items_id)
    GROUP BY items_id';
$result = mysql_query($q);

$total_stars = array();
while ($row = mysql_fetch_array($result))
{
    $total_stars[] = $row['rate']; // Stars count is stored in $row['rate']
    echo "Item id ".$row['items_id']." has rating ".$row['rate'];

}
于 2012-07-20T15:23:25.027 に答える
1

コメントで提案されているように、JOINを使用してみませんか?アイテムのすべての評価を含む配列が必要な場合は、これが方法です(PHP dbコードはテストしませんでしたが、クエリはテストしました)。

$total_stars = array();

$q = 'SELECT 
        items.item_id,
        COUNT(ratings.item_id) AS rate 
      FROM `items`
      LEFT JOIN ratings ON (ratings.item_id = items.item_id)
      GROUP BY item_id';
$result = mysql_query($q);

$total_stars = mysql_fetch_array($result);

代わりにMYSQLiまたはPDO_MYSQLを使用する必要があります。詳細MYSQLi詳細PDO

そして、ここでJOINSに関する詳細情報を見つけることができます:MYSQL結合に関する情報

于 2012-07-20T15:49:28.667 に答える