Php mySQL语法有什么问题?

Php mySQL语法有什么问题?,php,mysql,Php,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

我正在使用下面的代码进行计数,并对数据库中的值求和

$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
如果删除select查询的前三行,它不会显示错误,而是打印错误的值

我的代码有问题

下面的代码对我来说非常好

$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);

我哪里出错了?

看起来Mysql不喜欢这一行。将COUNTn.*更改为COUNTn.id或该表主键字段的任何名称。对a和c执行相同的操作。

您不能使用counttablename.*,请尝试使用counttablename。columnname

您可以尝试

从新闻中选择计数作为cnt_新闻, 从广告中选择COUNT作为cnt_adv,


好吧,我放弃了将我的查询转换成单个查询的想法,并且按照Shrapnel上校的建议,我为它做了一个自定义函数,我发现用这种方式维护代码非常容易。谢谢你,夏普内尔上校,我正在发布他建议的答案

这是我创建的用户定义函数

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");

上面的代码对我来说工作得非常好。

我尝试了你的方法,错误消失了,但为什么它会打印错误的值?我在数据库表中有两行,它显示的是30行您正在对三个表进行完全联接:新闻n、广告a、评论c。。。尝试将每个表的COUNTn.id和等效项替换为COUNTDISTINCT n。id@Mark贝克:很好,我甚至没有注意到问题的其余部分。这3个表是否在任何列上连在一起?我猜想新闻有评论和广告。@Mark Baker您的代码适用于我使用代码的前三个查询。COUNTDISTINCT n.id作为cnt_news,这可以很好地工作,但是如果我在第四个查询中添加distinct,它仍然会给出错误的值?在合并的原始查询集中也没有任何类型的联接,但最好的答案是进行适当的联接需要OP提供更多的输入来帮助识别联接,而不是使用DIRECTIVE尝试更改为COUNTn.id作为cnt_新闻,ut工作但打印出错误的值,。。知道为什么吗?如果指定的列有空值,count命令将忽略这些值,请尝试在表的id列或非空列上使用count