0

データベースから foreach ループを実行したいのですが、開始方法がわかりません。while ループから生成した配列があります。

    /* mysql query for geting leave_type ID */

    $leaveType = mysql_query("
    SELECT `leave`.leave_type_id_leave_type,
      `leave`.staff_leave_application_staff_id_staff,
      `leave`.date,
      `leave`.date_updated,
      `leave`.active
    FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid
    GROUP BY `leave`.leave_type_id_leave_type   
    ");

    /* Now put all leave Type ID in an array */

   echo "<table>";
   $types = array();
    while($leaveFW = mysql_fetch_array( $leaveType )){
        $types[] = $leaveFW['leave_type_id_leave_type'];
    }
print_r($types);

ここで、配列内の各 ID に対して以下のコードを照会する foreach ループを実行したいと考えています。:

$leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
month FROM `leave`
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
and `leave`.leave_type_id_leave_type = $type"); 

foreachループで表示$leaveQ['month']したい。$leaveQ['total']

このような私の foreach かもしれませんが、取得方法$type['month']$type['total']:

foreach ($types as $type)
{
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as month
    FROM `leave` WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type");
}
4

4 に答える 4

2

このようなものが欲しいかもしれません

foreach($types as $result)
{
    $iid  = $result['staff_leave_application_staff_id_staff'];
    $type = $result['leave_type_id_leave_type'];

    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave`
        WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
     and `leave`.leave_type_id_leave_type = '".$leaveFW['leave_type_id_leave_type']."'");


    while($row = mysql_fetch_assoc($leaveQ))
    {
       echo $row['month']."<br>";
       echo $row['total']."<br>";
    }
 }
于 2013-03-22T08:48:11.127 に答える
2

これをしないでください!

  • mysql_ 関数は PHP 5.5 で非推奨になりました!
  • これを行う (1 つのクエリを取得し、foreach ループ内の各行に対して別のクエリを実行する) のは悪いアプローチであり、「ネット上を飛び回る多くのコードでよく見られます...
  • また、毎月のカウントを取得したいと思います。その場合、そのために GROUP BY 句を使用する必要があります

これを行う適切な方法は、JOIN 操作を使用することです。行ごとにクエリを実行する代わりに、1 つのクエリだけですべてのデータを取得します。

そのアドバイスにやみくもに従い、あまり変更せず、2 つのクエリをマージするだけで、クエリは次のようになります。

SELECT Count(*) as total, monthname(date) as month, types.leave_type_id_leave_type
FROM `leave`
JOIN (SELECT DISTINCT `leave`.leave_type_id_leave_type
    FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid) as types 
  ON leave.leave_type_id_leave_type = types.leave_type_id_leave_type
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
GROUP BY monthname(date), types.leave_type_id_leave_type

あなたのアプローチとの違い:

  • 内部クエリは最初のクエリとほぼ同じですが、
    • GROUP BY の代わりに、DISTINCT を使用しました。この場合も同じですが、こちらの方が読みやすいと思います。これは重要な側面です。
    • 関連する列のみを選択しました(leave_type_id_leave_type)
  • 外側のクエリをもう少し変更しました
    • JOIN は、「foreach」アプローチを置き換えるものを行います
    • 内部クエリに適した行のみが「カウントされます」(この場合、文字通り:) )。
  • これにより、各月および各タイプのカウントが返されます。

これをさらに改善するには:

  • 適切にパラメーター化された準備済みステートメントを使用します。パフォーマンスが向上し、それに慣れると、それが適用される状況での SQL インジェクションを回避できます...
    • そのためにPDOを使用できますが、非推奨ではありません...
  • 結果のクエリを見ると、これをさらに単純化できることが簡単にわかります。内部クエリは必要なく、$iid のフィルターも 1 つ取り除かれます。

 

SELECT Count(*) as total, monthname(date) as month, leave_type_id_leave_type
FROM `leave`
WHERE `leave`.staff_leave_application_staff_id_staff = $iid
GROUP BY monthname(date), leave_type_id_leave_type

現在の違い:

  • 大幅なパフォーマンスのジャンプ...
  • はるかに少なく、多くの可読コード

編集

これがどのように機能するかを確認するためのSQLフィドルは次のとおりです

于 2013-03-22T08:48:54.030 に答える
0
   foreach($types as $type){
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type"); 
    while($leave = mysql_fetch_assoc($leaveQ)){
    var_dump($leave['total'] , $leave['month']);
    }
   }
于 2013-03-22T08:48:39.883 に答える
0

私が正しく理解している場合は、コード ブロックから見つかった型をループしてから、さらにデータベース クエリを発行し、さらにデータを抽出する必要があります。

基本的に、最初のコード ブロックを再度再利用して、foreach ループでラップすることができます。

foreach($types as $type){
    $query = mysql_query("YOUR_SQL_USING_$TYPE");

    while($row = mysql_fetch_array( $query )){
        print_r($row);
        // or print($row['COLUMN_NAME']);...
    }    
}
于 2013-03-22T08:49:34.450 に答える