2011-07-27 38 views
2

無論我做什麼,我都無法將此代碼獲取到echo $doneMySQL聯合和PHP,不是朋友?

這裏是我的代碼摘錄,我無法爲我的生活工作。我嘗試了五種不同的方式,但沒有任何工作。我唯一的結論是,由於聯盟,它不起作用。

有沒有辦法解決這個問題?或者這甚至是問題?

$query01 = "SELECT COUNT(DISTINCT report) AS ip 
       FROM reports 
        WHERE country = '".$country."' 
        AND YEAR(date) = '2011' 
        AND MONTH(date) = '".$i."' AND 
        status ='IP' 
     UNION 
      SELECT COUNT(DISTINCT report) AS done 
       FROM reports 
        WHERE country = '".$country."' 
        AND YEAR(date) = '2011' 
        AND MONTH(date) = '".$i."' 
        AND status ='DONE'"; 

$result01 = mysql_query($query01); 

while ($row01 = mysql_fetch_array($result01)) { 
    $ip = $row01['ip']; 
    $done = $row01['done']; 
    $all = $ip + $done; 

    if($all>0){ 
     echo "<td>".$ip.":".$done."</td>"; 
    } 

    else{ 
     echo "<td>-</td>"; 
    } 

} 
+1

'UNION'將兩個選擇合併在一起,它不會「連接」它們。在這種情況下,'UNION'只能提供1列。 – thetaiko

+0

你假設它們是同一行上的兩列,但實際上它們是兩行。第一行包含「ip」,第二行包含「done」。 – Jacob

+0

回想起這一點,我似乎混淆了列和行。感謝您的幫助,朋友。 –

回答

2

我猜你是想獲得ipdone在這種情況下,UNION不是你查詢的正確選擇每行的兩列。

試試這個:你需要了解UNION

$query01 = "SELECT a.ip, b.done 
    FROM 
    (
    SELECT COUNT(DISTINCT report) AS ip 
        FROM reports 
         WHERE country = '".$country."' 
         AND YEAR(date) = '2011' 
         AND MONTH(date) = '".$i."' AND 
         status ='IP' 
     ) a, 
     (
       SELECT COUNT(DISTINCT report) AS done 
        FROM reports 
         WHERE country = '".$country."' 
         AND YEAR(date) = '2011' 
         AND MONTH(date) = '".$i."' 
         AND status ='DONE' 
     ) b"; 

    $result01 = mysql_query($query01); 

    while ($row01 = mysql_fetch_array($result01)) { 
     $ip = $row01['ip']; 
     $done = $row01['done']; 
     $all = $ip + $done; 

     if($all>0){ 
      echo "<td>".$ip.":".$done."</td>"; 
     } 

     else{ 
      echo "<td>-</td>"; 
     } 

    } 
+0

是的,這是一個完美的工作。非常感謝您的澄清! –

1

你的聯盟unioning具有不同列中的兩個疑問:他們中的一個有一個名爲ip一列,另外有一個名爲done。 MySQL有可能返回一個名爲ip的列的結果集,因爲這是它遇到的第一個名字。 done列的值連接到ip列的值,但該列已經有名稱ip。沒有列名爲done。也許嘗試:

$query01 = "SELECT COUNT(DISTINCT report) AS report_count, 'ip' as indicator 
       FROM reports 
        WHERE country = '".$country."' 
        AND YEAR(date) = '2011' 
        AND MONTH(date) = '".$i."' AND 
        status ='IP' 
     UNION 
      SELECT COUNT(DISTINCT report) AS report_count, 'done' as indicator 
       FROM reports 
        WHERE country = '".$country."' 
        AND YEAR(date) = '2011' 
        AND MONTH(date) = '".$i."' 
        AND status ='DONE'"; 

的查詢現在都具有相同的列,您可以選擇打印行,其中indicator = 'done'

1

當您進行聯合查詢時,每個組件中的列數必須匹配(您的),並且發出的FIRST查詢中的別名將如何將列名返回給客戶端(您的腳本) 。在你的情況,你將只有一個ip列 - 永遠不會有done列。

,如果你需要區分在哪裏,結果每一行的來源(其成分查詢發行的),你可以創建一個虛擬列,以指示源:

SELECT 'ip' as src, COUNT(...) as cnt 
UNION 
SELECT 'done' as src, COUNT...) as cnt 

所以現在你將有兩列被退回,並可以作爲$row['src']$row['cnt']訪問它們。

2

事情:

  • UNION追加排在一起,它不會把它們並排側列。
  • 列名由UNION中的第一個查詢確定,並且不能更改。因此,您的專欄將被命名爲ip,並且您在第二個查詢中定義的名稱done將被忽略。

我建議使用GROUP BY作爲此查詢而不是UNION。然後按行處理結果。下面是一個例子(未經測試):

$query01 = "SELECT status, COUNT(DISTINCT report) AS c 
      FROM reports 
      WHERE country = '{$country}' 
       AND date between '2011-{$i}-01' AND '2011-{$i}-32' 
       AND status IN ('IP','DONE') 
      GROUP BY status"; 

$result01 = mysql_query($query01); 

$status_count = array("IP"=>0, "DONE"=>0); 
while ($row01 = mysql_fetch_array($result01)) { 
    $status_count[ $row01["status"] ] = $row01["c"]; 
} 

if (array_sum($status_count) > 0) { 
    echo "<td>{$status_count["IP"]}:{$status_count["DONE"]}</td>"; 
} 

else { 
    echo "<td>-</td>"; 
}