SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.07.2009 14:00:39

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Что я неправильно делаю?

Привет! Делаю запрос:

Код:

 SELECT COUNT(message.id)    AS total_messages,
        COUNT(articles.id)   AS total_articles,
        users.login          AS name,
        users.money,
        users.rating

 FROM   users, articles, message

 WHERE  articles.id_author = '$user_id' AND
        users.id           = '$user_id' AND
        users.role         = 'author'   AND
        message.to         = '$user_id' AND
        message.status     = 'unread'

преамбула: этот запрос выводит общую информацию о пользователе: сколько новых сообщений, сколько статей, денег, рейтинг.

Так вот. Все выводится правильно, кроме поля total_messages, которому присваивается почемуто значение поля total_articles (это проверенный факт, если сделать изменения в базе чтоб изменилось количество статей, то измениться и total_messages).
Запрос выводит только 1 row.

Также пробывал через join-ы, но результат такой же:

Код:

 SELECT COUNT(message.id)   AS total_messages,
        COUNT(articles.id)  AS total_articles,
        users.login         AS name,
        users.money,
        users.rating        AS rating
        
 FROM   users
 
 LEFT JOIN articles ON articles.id_author = '$user_id'
 LEFT JOIN message  ON message.to = '$user_id' AND
                       message.status = 'unread'

 WHERE  users.id = '$user_id' AND
        users.role = 'author'

Вот пример результата:

Код:

Array
(
    [total_messages] => 19
    [total_articles] => 19
    [name] => jambo
    [money] => 85.07
    [rating] => 8
)

total_messages должен быть = 1.

В чем ошибка?

Неактивен

 

#2 20.07.2009 17:13:52

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Что я неправильно делаю?

Нашел простейший неработающий вариант:

Итак, это запрос работает как надо:


SELECT COUNT(message.id) AS total_messages
FROM   message
 


Результат:
total_messages=1

Второй запрос, уже с ошибкой, результаты неправильны:

SELECT COUNT(message.id) AS total_messages,
       COUNT(articles.id) AS total_articles
FROM   message, articles
 


Результаты:
total_messages=19 (хотя только что было 1)
total_articles=19

Неактивен

 

#3 20.07.2009 17:45:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Что я неправильно делаю?

Вы используете групповые функции count() без GROUP BY.

Неактивен

 

#4 20.07.2009 18:18:10

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Что я неправильно делаю?

Я попробывал вставить GROUP BY, но теперь результат выводится в виде 19 колонок, тоесть тоже неправильно:


SELECT COUNT(articles.id) AS total_articles,
       COUNT(message.id) AS total_messages

FROM   message, articles

GROUP BY articles.id
 

Неактивен

 

#5 20.07.2009 19:04:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Что я неправильно делаю?

smackthat написал:

Я попробывал вставить GROUP BY, но теперь результат выводится в виде 19 колонок,

Скорее 19 строк.


smackthat написал:

Второй запрос, уже с ошибкой, результаты неправильны:

SELECT COUNT(message.id) AS total_messages,
       COUNT(articles.id) AS total_articles
FROM   message, articles



Результаты:
total_messages=19 (хотя только что было 1)
total_articles=19

Вы формируете таблицу из 2ух колонок и 19 строк и просите посчитать количество строк в первой и второй колонке. Закономерно, что результат в обоих случаях 19.
А если вы добавите в таблицу message ещё одно значение, то результат будет 38.

Посмотрите вывод

SELECT message.id, articles.id FROM   message, articles;
и поймете почему такие результаты.

Вам нужно посчитать не количество значений, что вы делаете сейчас, а кол-во уникальных значений.
SELECT COUNT(distinct message.id) AS total_messages,
       COUNT(distinct articles.id) AS total_articles
FROM   message, articles

Неактивен

 

#6 20.07.2009 19:36:36

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Что я неправильно делаю?

большое спасибо, хотя я совершенно не понимаю почему все происходит именно так. Что мне почитать, хочу просвятиться?

Неактивен

 

#7 20.07.2009 19:54:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Что я неправильно делаю?

Классика:
http://dev.mysql.com/doc/refman/5.0/en/

Что посоветовать на русском даже не знаю. Разве, что больше экспериментруйте и задавайте здесь вопросы.

Неактивен

 

#8 20.07.2009 21:43:25

smackthat
Завсегдатай
Зарегистрирован: 18.02.2009
Сообщений: 32

Re: Что я неправильно делаю?

спасибо, вопросы обязательно буду задавать

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson