За последние 24 часа нас посетили 19323 программиста и 1615 роботов. Сейчас ищет 981 программист ...

Нужна помощь - Count() и SUM() из трёх таблиц

Тема в разделе "Прочие вопросы по PHP", создана пользователем Oleg_php, 20 июн 2012.

  1. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Есть три таблицы. Каждая таблица в последующем связана с другой.

    Первая таблица главная participant
    Код (Text):
    1.  
    2. p_id    p_name
    3.   1     Клиент первый
    4.   2     Клиент второй
    Вторая таблица advertising_campaign
    Код (Text):
    1.  
    2. ac_id    ac_name             ac_participant         ac_views_start
    3.    1     Реклама 1 клиента            1                  5000          
    4.    2     Реклама 1 клиента            1                  3000
    5.    3     Реклама 2 клиента            2                  1500          
    6.    4     Реклама 1 клиента            1                  1000
    Третья таблица advertising_link
    Код (Text):
    1.  
    2. cl_id   ac_id
    3.   1        1
    4.   2        2
    5.   3        1
    6.   4        1
    7.   5        2
    8.   6        2
    Помогите составить запрос, по подсчёту суммы ac_views_start и количества cl_id. Пример моего запроса, но пока он только посчитывает только сумму ac_views_start .

    Запрос
    Код (Text):
    1.  
    2. SELECT
    3.                p.p_id, p.p_name,
    4.                ac.ac_id, ac.ac_name, ac.ac_participant, ac.ac_views_start,
    5.                SUM(ac.ac_views_start) AS Views                        
    6. FROM
    7.                participant p
    8. LEFT JOIN
    9.                advertising_campaign ac ON (p.p_id=ac.ac_participant)      
    10. GROUP BY
    11.                p.p_id
    Как теперь вытащить количество COUNT(cl_id ) ac.ac_id = advertising_link.ac_id
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    В SELECT также и пишите.
    В чем проблема?

    Код (PHP):
    1. SELECT p.p_id, p.p_name, ac.ac_id, ac.ac_name, ac.ac_participant, ac.ac_views_start, SUM(ac.ac_views_start) AS Views, COUNT(ac.cl_id) as counts
    2. FROM participant as p
    3. LEFT JOIN advertising_campaign as ac ON p.p_id=ac.ac_participant   
    4. GROUP BY p.p_id
     
  3. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    У вас получается запрос к двум таблицам, а у меня три и колонка cl_id принадлежит не к advertising_campaign, а к advertising_link. Поэтому и спрашиваю как можно расширить запрос чтобы всё в одном уместилось.
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А я и не старался его переписывать, суть поняли?
    Подключайте хоть 10 таблиц это не важно в SELECT отправка происходит.
     
  5. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Проблема в том что он перемножает значения. И я хотел узнать как этого можно избежать, при использовании Left Join.
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Что именно по подробнее говорите, не понятно...

    Что перемножает?
     
  7. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Допустим если я делаю вот такой запрос :
    Код (Text):
    1.  
    2. SELECT
    3.                p.p_id, p.p_name,
    4.                ac.ac_id, ac.ac_name, ac.ac_participant, ac.ac_views_start,
    5.                SUM(ac.ac_views_start) AS Views,
    6.                COUNT(al.cl_id) AS Click
    7. FROM
    8.                participant p
    9. LEFT JOIN
    10.                advertising_campaign ac ON (p.p_id=ac.ac_participant)  
    11. LEFT JOIN
    12.                advertising_link al ON (ac.ac_id = al.ac_id)      
    13. GROUP BY
    14.                p.p_id
    То у меня SUM(ac.ac_views_start) в несколько раз больше чем на самом деле.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    :D

    SUM()

    cl_id
    1
    2
    2

    -

    1
    +
    2
    +
    2
    =
    5

    COUNT()
    cl_id
    1
    2
    2
    =
    3
    Тут будет считать вхождения.
    То есть все найденные вхождения по условию.
    А не складывать, то, что в них...

    Если вы только это хотите сделать, то не вижу смысла в SUM().
    Если не нужно ничего складывать и выводить, то уберите.
    А если складывать нужно тоже, то оставьте =))))
    Но это будет два разных действия.
     
  9. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Мне надо проссумировать все ac.ac_views_start по условию и просчитать al.ac_id.
    Пример кода можно?
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    GROUP BY p.p_id

    Зачем оно?)
    Вы же тут просто складываете и считаете по условию.
    И не понимаю, зачем столько таблиц?))))
    Что там у вас такое, вообще ?)

    ac_participant это тоже самое, что и ac_id ?
     
  11. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Это мини баннерная сеть. Есть в отдельной таблице Имена клиентов (participant) далле рекламная компания их (advertising_campaign) и количество переходов (advertising_link).
    Взаимо связь такая, сначала идёт выборка всех рекламных компаний клиента по условию
    Код (Text):
    1.  
    2. participant.p_id = advertising_campaign.ac_participant
    и идёт сложение всех показов каждой рекламной компании по полю (advertising_campaign.ac_views_start). Условие должно быть вот такое

    Далее подсчёт количество переходов COUNT(advertising_link.cl_id) по каждой рекламной компании
    Код (Text):
    1.  
    2. advertising_link.ac_id = advertising_campaign.ac_id
     
  12. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    бр...
    лень... =)


    Заплатишь?)))

    Может быть пойму?))
     
  13. Gambit

    Gambit Активный пользователь

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    ТС, должно выглядеть как?

    Реклама / count(ac_views_start) / count(cl_id)

    или

    Имя клиента / count(ac_views_start) / count(cl_id)

    Добавлено спустя 1 минуту 3 секунды:
    Объясниет так же, что означают эти колонки, а то так не понятно. Вивес - ясно, просмотры. А cl_id ?

    Добавлено спустя 23 минуты 44 секунды:
    Готово! Если я тебя верно понял)
    Код (Text):
    1. SELECT p_name, SUM(advertising_campaign.ac_views_start) AS views, al.count
    2. FROM participant
    3. LEFT JOIN advertising_campaign ON participant.p_id = advertising_campaign.ac_participant
    4. LEFT JOIN (
    5.     SELECT p_id AS id, COUNT(*) AS count
    6.     FROM participant
    7.     LEFT JOIN advertising_link ON participant.p_id = advertising_link.ac_id
    8.     GROUP BY id
    9. ) AS al ON participant.p_id = al.id
    10. GROUP BY participant.p_id;