Что не так с синтаксисом MySQL?

0

Я использую следующий код для подсчета и суммирования значений из базы данных.

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

Где я ошибаюсь?

Теги:

4 ответа

1
Лучший ответ

Ну, я отказался от идеи сделать мои запросы в одну, и, как предложил Col.Shrapnel, я сделал для нее настраиваемую функцию, и мне было очень легко поддерживать код таким образом. спасибо, полковник Шарпнель, я отправляю предложенный им ответ.

это созданная пользователем функция i.

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

Вы можете попробовать

SELECT (SELECT COUNT() FROM news) AS cnt_news,         (SELECT COUNT() FROM рекламы) как cnt_adv,         ...

0

Похоже, Mysql не любит эту строку. Измените COUNT(n.*) на COUNT(n.id) или на любое другое имя поля первичного ключа этой таблицы. Сделайте то же самое для a и c.

  • 0
    я пробовал ваш путь ошибка исчезает, но почему, черт возьми, он печатает неправильные значения? у меня есть два числа строк в таблице базы данных, и вместо этого он показывает 30. :(
  • 1
    Вы выполняете полное объединение трех таблиц: новости n, реклама a, комментарии c ... попробуйте заменить COUNT (n.id) (и эквивалент для каждой из ваших таблиц) на COUNT (DISTINCT n.id)
Показать ещё 7 комментариев
0

Вы не можете использовать count(tablename.*), попробуйте использовать count(tablename.columnname)

  • 0
    я попытался изменить на COUNT (n.id) как cnt_news, но работает, но выводит неправильные значения, ... есть идеи, почему?
  • 0
    Если указанный вами столбец имеет значения NULL, команда count будет игнорировать их, попробуйте использовать счетчик в столбце id таблицы или в ненулевом столбце

Ещё вопросы

Сообщество Overcoder
Наверх
Меню