Есть три таблицы. Каждая таблица в последующем связана с другой. Первая таблица главная participant Код (Text): p_id p_name 1 Клиент первый 2 Клиент второй Вторая таблица advertising_campaign Код (Text): ac_id ac_name ac_participant ac_views_start 1 Реклама 1 клиента 1 5000 2 Реклама 1 клиента 1 3000 3 Реклама 2 клиента 2 1500 4 Реклама 1 клиента 1 1000 Третья таблица advertising_link Код (Text): cl_id ac_id 1 1 2 2 3 1 4 1 5 2 6 2 Помогите составить запрос, по подсчёту суммы ac_views_start и количества cl_id. Пример моего запроса, но пока он только посчитывает только сумму ac_views_start . Запрос Код (Text): 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 FROM participant p LEFT JOIN advertising_campaign ac ON (p.p_id=ac.ac_participant) GROUP BY p.p_id Как теперь вытащить количество COUNT(cl_id ) ac.ac_id = advertising_link.ac_id
В SELECT также и пишите. В чем проблема? Код (PHP): 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 FROM participant as p LEFT JOIN advertising_campaign as ac ON p.p_id=ac.ac_participant GROUP BY p.p_id
У вас получается запрос к двум таблицам, а у меня три и колонка cl_id принадлежит не к advertising_campaign, а к advertising_link. Поэтому и спрашиваю как можно расширить запрос чтобы всё в одном уместилось.
А я и не старался его переписывать, суть поняли? Подключайте хоть 10 таблиц это не важно в SELECT отправка происходит.
Проблема в том что он перемножает значения. И я хотел узнать как этого можно избежать, при использовании Left Join.
Допустим если я делаю вот такой запрос : Код (Text): 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(al.cl_id) AS Click FROM participant p LEFT JOIN advertising_campaign ac ON (p.p_id=ac.ac_participant) LEFT JOIN advertising_link al ON (ac.ac_id = al.ac_id) GROUP BY p.p_id То у меня SUM(ac.ac_views_start) в несколько раз больше чем на самом деле.
SUM() cl_id 1 2 2 - 1 + 2 + 2 = 5 COUNT() cl_id 1 2 2 = 3 Тут будет считать вхождения. То есть все найденные вхождения по условию. А не складывать, то, что в них... Если вы только это хотите сделать, то не вижу смысла в SUM(). Если не нужно ничего складывать и выводить, то уберите. А если складывать нужно тоже, то оставьте =)))) Но это будет два разных действия.
GROUP BY p.p_id Зачем оно?) Вы же тут просто складываете и считаете по условию. И не понимаю, зачем столько таблиц?)))) Что там у вас такое, вообще ?) ac_participant это тоже самое, что и ac_id ?
Это мини баннерная сеть. Есть в отдельной таблице Имена клиентов (participant) далле рекламная компания их (advertising_campaign) и количество переходов (advertising_link). Взаимо связь такая, сначала идёт выборка всех рекламных компаний клиента по условию Код (Text): participant.p_id = advertising_campaign.ac_participant и идёт сложение всех показов каждой рекламной компании по полю (advertising_campaign.ac_views_start). Условие должно быть вот такое Далее подсчёт количество переходов COUNT(advertising_link.cl_id) по каждой рекламной компании Код (Text): advertising_link.ac_id = advertising_campaign.ac_id
ТС, должно выглядеть как? Реклама / count(ac_views_start) / count(cl_id) или Имя клиента / count(ac_views_start) / count(cl_id) Добавлено спустя 1 минуту 3 секунды: Объясниет так же, что означают эти колонки, а то так не понятно. Вивес - ясно, просмотры. А cl_id ? Добавлено спустя 23 минуты 44 секунды: Готово! Если я тебя верно понял) Код (Text): SELECT p_name, SUM(advertising_campaign.ac_views_start) AS views, al.count FROM participant LEFT JOIN advertising_campaign ON participant.p_id = advertising_campaign.ac_participant LEFT JOIN ( SELECT p_id AS id, COUNT(*) AS count FROM participant LEFT JOIN advertising_link ON participant.p_id = advertising_link.ac_id GROUP BY id ) AS al ON participant.p_id = al.id GROUP BY participant.p_id;