2010-09-13 77 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 , ...