2017-04-05 66 views
0

我有一個查詢,我真的很感謝任何幫助。循環遍歷一個查詢的結果並將它們插入另一個查詢,加入聯合所有結果的第二個查詢

我有第一個查詢,選擇一個表中的job_types(26結果)。這些job_type名稱都與一個與其名稱相同的單獨表格有關。然後,我需要使用此結果(job_types列表)在所有相關的job_type表上調用一個新的查詢 - 循環遍歷第一個查詢的結果,將它們插入到第二個查詢中,然後我嘗試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 "; 

} 

我知道我需要把在一個循環,以工會的表和運行通過他們,直到最後一個,所以while循環的東西,我是想出來,如是FOREACH循環。我只是在學習(慢)PHP,並會非常感謝任何幫助。

編輯 我已經添加了下面的代碼到最後嘗試讓它顯示。

$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>"; 
    } 

但是,後來我跑了,我返回下面的錯誤 - 「捕致命錯誤:類mysqli_result的對象無法轉換爲字符串」 AS table行上「$表」。

+0

* 「但我堅持!」 *:請描述你所遇到的問題。被卡住不是很有啓發性。 – trincot

+0

我已經添加上面的編輯,爲一般道歉。我不確定關於我需要的循環@trincot – seb

回答

0

你在評論中的部分是更好的嘗試,所以我會專注於該代碼塊。

的一些問題:

  • query方法返回一個結果對象。您不應該將它分配給$tables[],這將使$tables具有一個結果對象的數組。只需將結果分配給$tables

  • fetch_assoc方法使得可作爲關聯記錄你的記錄,所以你不應該使用對象符號$table->,但括號:$table[ ... ]

  • SQL中的條款FROM不應後面引號的東西,但這個名字本身,所以不要把單引號有

  • 當你在雙引號字符串表達式嵌入,你需要用大括號將它們包裹起來,如{$table[...]}。沒有這些大括號,只能嵌入原子變量,如$startDate

  • 在MySQL SQL日期必須加引號(我假設$startDate$endDate都是字符串)

  • 在SQL中IS算真的打算結合NULL,不與其它價值。更重要的是,檢查與TRUE平等往往是矯枉過正,因爲你可能只是測試的平等

  • 要與UNION加入不同的SQL代碼段左側的表達,你可以先收集他們在一個數組,然後應用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

相關問題