2010-09-13 76 views
0

我正在使用以下代碼進行計數,並對數據庫中的值進行求和。mySQL語法有什麼問題?

$query = "SELECT 
      COUNT(n.*) AS cnt_news, 
      COUNT(a.*) AS cnt_adv, 
      COUNT(c.*) AS cnt_comm, 
      SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved, 
      SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved, 
      SUM(CASE WHEN c.spam = '0' THEN 1 ELSE 0 END) AS cnt_spam, 
      SUM(a.amount) AS t_amnt, 
      SUM(a.cashpaid) AS t_cpaid, 
      SUM(a.balance) AS t_bal 
      FROM 
      news n, advertisements a, comments c"; 
      $result = mysql_query($query) or die(mysql_error()); 
      $row = mysql_fetch_array($result); 

下面的代碼給我一個錯誤,錯誤的是

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS cnt_news, COUNT(a.*) AS cnt_adv, COUNT(c.*) AS cnt_c' at line 2 

如果我刪除前三行的選擇查詢的,它並沒有顯示錯誤,而不是它打印錯誤的價值觀。

這是錯誤的我的代碼。 ??

以下代碼對我來說工作得非常好。

$query = "SELECT COUNT(*) as cnt_news FROM news"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result); 


$query = "SELECT COUNT(*) as cnt_adv FROM advertisements"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result); 

$query = "SELECT COUNT(*) as cnt_comm FROM comments"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result); 


$query = "SELECT SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved, 
      SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved, 
      SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam 
      FROM COMMENTS c"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result); 


$query = "SELECT SUM(a.amount) as t_amnt, 
      SUM(a.cashpaid) as t_cpaid, 
      SUM(a.balance) as t_bal 
      FROM advertisements a"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result); 

我在哪裏出錯了?

回答

1

那麼我放棄了使我的查詢成爲一個單一的想法,並作爲建議由Col.Shrapnel構建,我爲它做了一個自定義函數,並且我發現用這種方法維護代碼非常容易。謝謝Col.Sharpnel,我發佈了他提出的答案。

這是我創建的用戶定義函數。

function dbgetvar($query) { 
      $res = mysql_query($query); 
     if(!$res) { 
      trigger_error("dbget: ". mysql_error(). " in " .$query); 
      return false; 
      } 
      $row = mysql_fetch_array($res); 
      if(!$row) return ""; 
      return $row; 
      } 

然後我使用這段代碼調用了我的函數。

 $news = dbgetvar("SELECT COUNT(*) as count FROM news"); 
$comments = dbgetvar("SELECT SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS approved, 
         SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS pending, 
         SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS spam, 
         COUNT(*) AS count 
         FROM COMMENTS c"); 
$advertise = dbgetvar("SELECT SUM(a.amount) AS amount, 
         SUM(a.cashpaid) AS cashpaid, 
         SUM(a.balance) AS balance, 
         COUNT(*) AS count 
         FROM advertisements a"); 

上面的代碼工作對我來說完全沒有問題。

0

它看起來像Mysql不喜歡那條線。將COUNT(n.*)更改爲COUNT(n.id)或該表的主鍵字段的名稱。對ac做同樣的事情。

+0

我試過你的方式錯誤消失,但爲什麼地獄它打印錯誤的值?我有兩個數據庫表中的行數,它顯示30代替。 :( – 2010-09-13 08:53:23

+1

你正在做一個完整的連接反對三個表新聞n,廣告a,評論c ...嘗試用COUNT(DISTINCT n.id)替換COUNT(n.id)(和您的每個表的等效項) – 2010-09-13 08:56:31

+0

@Mark Ba​​ker很好,我甚至沒有注意到查詢的其餘部分。這3個表格是否加入了任何列?我認爲新聞有評論和廣告。 – Fanis 2010-09-13 09:04:24

0

不能使用count(tablename.*),請嘗試使用count(tablename.columnname)

+0

我試圖更改爲COUNT(n.id)作爲cnt_news,ut工作,但打印出錯誤的值,..任何想法爲什麼? – 2010-09-13 08:54:59

+0

如果您指定的列具有NULL值,則count命令將忽略它們,嘗試使用表的id列上的計數或非空列 – JohnoBoy 2010-09-13 10:05:36

0

您可以嘗試

SELECT(SELECT COUNT()從新聞)AS cnt_news, (SELECT COUNT()FROM廣告)作爲cnt_adv , ...