2017-04-05 17 views
0

私は本当に助けてくれると感謝しています。1つのクエリーの結果をループして別のクエリーに挿入し、別のクエリーに挿入します.2番目のクエリーのすべての結果

私は、1つのテーブル(26結果)でjob_typesを選択する最初のクエリを持っています。これらのjob_typeの名前はすべて、それらと同じ名前の別個のテーブルに関連しています。次に、この結果(job_typesのリスト)を使用して、関連するすべてのjob_typeテーブルで新しいクエリを呼び出す必要があります。最初のクエリの結果をループし、2番目のクエリに挿入して、UNIONにしようとしています。結果をテーブルに出力します。しかし、私はループで立ち往生しています。

$sql = ""; 
$union = ""; 
$tables = []; 

$q = "SELECT DISTINCT job_table 
     FROM job_type 
     WHERE job_type NOT IN (26, 28) AND status = 1"; 

$tables[] = $conn->query($q); 
print_r($tables); 

/*while ($table = $tables->fetch_assoc()) { 
      $sql .= "SELECT 
        DATE(call_time) AS `date`, 
        COUNT(*) AS `sub_total`, 
        '$table->job_table' AS `table` 
       FROM '$table->job_table' 
       WHERE table.show IS TRUE AND call_time BETWEEN $startDate AND $endDate 
       AND table.processing_complete IS TRUE 
       GROUP BY `date`"; 
      }*/ 

foreach ($tables AS $table) { 
    $sql .= $union . "SELECT 
        DATE(call_time) AS `date`, 
        COUNT(*) AS `sub_total`, 
        '$table' AS `table` 
       FROM '$table' 
       WHERE table.show IS TRUE AND call_time BETWEEN $startDate AND $endDate 
       AND table.processing_complete IS TRUE 
       GROUP BY `date`"; 
    $union = " UNION "; 

} 

は私が最後の1までそれらを介して組合するために、ループ内のテーブルを入れて実行する必要が知っているので、WHILEループをとして、私がしようとしていたものです:私のコードは、これまでのところですFOREACHループです。私は(ゆっくりと)PHPを学んでいるだけで、何か助けていただければ幸いです。

EDIT 最後に次のコードを追加して表示させていただきました。 tableラインAS「$テーブル」上:「クラスmysqli_resultのオブジェクトを文字列に変換することができませんでしたキャッチできる致命的なエラー」 -

$results = $conn->query($sql); 
} 
while ($row = $results->fetch_assoc()) { 
     echo"<TABLE><TR><TD>". $row["date"]. "</TD>"; 
     echo"<TD>". $row["sub_total"]. "</TD>"; 
     echo"<TD>". $row["table"] . "</TD></TR>"; 
    } 

はしかし、その後、私は次のエラーを返しています、それを実行します。

+0

* "しかし、私がこだわっている!!" *:あなたが持っている問題を記述してください。立ち往生することはあまり啓発されていません。 – trincot

+0

私は上記の編集を追加しました。私はループについて私は@ trunkot – seb

答えて

0

あなたがコメントに入れた部分がより良い試みだったので、私はそのコードブロックに焦点を当てます。

いくつかの問題:

  • query方法は、結果オブジェクトを返します。 $tables[]に割り当てるべきではありません。$tablesは1つの結果オブジェクトを持つ配列になります。結果を$tablesに割り当ててください。 $table[ ... ]:あなたがオブジェクト表記$table->が、ブラケットを使用すべきではありませんので、

  • fetch_assoc方法は、連想レコードとしてあなたの記録を利用できるようになります。

  • SQLでFROM句は引用符の中で何かが続くべきではありませんが、あなたは、二重引用符で囲まれた文字列で式を埋め込むと名前自体が、あなたが必要とする、そこ

  • を単一引用符を入れていません{$table[...]}のように中かっこで囲みます。これらの中カッコがなければ、$startDateのような原子変数のみを埋め込むことができます。

    のMySQLのSQLの日付で
  • は引用符で囲む必要があります(私は$startDate$endDateが文字列であると仮定)SQLでは

  • ISオペレータは本当にNULLではなく、他の値との組み合わせで目的としています。しかも、あなただけUNIONと異なるSQLスニペットに参加するには平等

  • の左側の表現をテストすることができようTRUEとの平等をチェックすることは、しばしば過剰です、あなたは最初の配列でそれらを収集して、適用することもできますそれにはimplode。また、UNION ALLの方がパフォーマンスが向上し、ケースに違いはありません。

修正されたコード:

// *** query method returns a result object, not an array: 
$tables = $conn->query($q); 

while ($table = $tables->fetch_assoc()) { 
    // *** Use {$ ... } notation, with bracket access, not '->'. 
    // *** Quote dates. Do not quote tables. Omit "IS TRUE". 
    // *** Collect into array. The `UNION` can be added later. 
    $sql[] = " 
     SELECT 
       DATE(call_start_time) AS `date`, 
       COUNT(*) AS `sub_total`, 
       '{$table[job_processing_table]}' AS `table` 
     FROM {$table[job_processing_table]} 
     WHERE table.show 
     AND  call_start_time BETWEEN '$startDate' AND '$endDate' 
     AND  table.processing_complete 
     GROUP BY `date`"; 
} 

// *** Add UNION: 
$sql = implode(" UNION ALL ", $sql) 
+0

が必要なのか分からないそれは意味がある、ありがとう。私はこれらの変更をあなたが提案したようにしましたが、私は今、次の通知を返しています - 注意:定義されていない定数の使用job_processing_table - 仮定 'job_processing_table' ..これが返される理由はありますか?ありがとう – seb

+0

私はそれを再現することはできませんが、おそらくその動作は、PHPのバージョンに依存します。 SQLの両方のオカレンスで 'job_processing_table'を一重引用符で囲んでみてください。 – trincot

+0

それは素晴らしいです、今私は結果を置く必要があります!ご協力いただき誠にありがとうございます – seb

関連する問題