Я пытаюсь сделать подсчет из нескольких таблиц в том же запросе, и результаты для 2 из них полностью ошибочны. Я следующие 3 таблицы, используемые в этом запросе:Выберите количество из двух разных таблиц без подзадача в подзапросе
CREATE TABLE `assignments` (
`id` int(11) NOT NULL,
`lead_id` int(11) NOT NULL,
`buyer_id` int(11) NOT NULL,
`refunded` int(11) NOT NULL DEFAULT '0',
`date_assigned` int(11) NOT NULL,
`date_refunded` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `leads` (
`id` int(11) NOT NULL,
`vertical_id` int(11) NOT NULL,
`source_id` int(11) NOT NULL,
`agent_id` varchar(255) DEFAULT NULL,
`status_id` int(11) NOT NULL DEFAULT '0',
`completeness` enum('Partial','Complete') DEFAULT NULL,
`freshness` enum('New','Duplicate') NOT NULL,
`date_created` int(11) NOT NULL,
`date_updated` int(11) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `verticals` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
То, что я хочу сделать, это приводит захватить и поместить их в таблицу, как это:
Name New Duplicate Partial Complete Total Assigned Refunded
Automotive 4 1 3 2 5 36 9
Education 16 7 9 14 23 36 9
Первые 5 номеров столбцов являются правильными , Проблема в том, что присвоенные и возвращенные номера столбцов являются полностью неправильными. Вот мой запрос:
select v.*,
(select count(*) from `leads` where vertical_id=v.id and `freshness`='New' and `date_created` between 1470009600 and 1471923227) as `new`,
(select count(*) from `leads` where vertical_id=v.id and `freshness`='Duplicate' and `date_created` between 1470009600 and 1471923227) as `duplicate`,
(select count(*) from `leads` where vertical_id=v.id and `completeness`='Partial' and `date_created` between 1470009600 and 1471923227) as `partial`,
(select count(*) from `leads` where vertical_id=v.id and `completeness`='Complete' and `date_created` between 1470009600 and 1471923227) as `complete`,
(select count(*) from `leads` where vertical_id=v.id and `date_created` between 1470009600 and 1471923227) as `total`,
(select count(*) from `assignments` where lead_id=l.id and `refunded`=0) as `assigned`,
(select count(*) from `assignments` where lead_id=l.id and `refunded`=1) as `refunded`
from `verticals` as v
left join `leads` as l on (l.vertical_id = v.id)
where l.date_created between 1470009600 and 1471923227
group by v.id
Как я могу исправить это без использования подвыбора внутри подзапросов (что было бы ужасно для производительности)?
EDIT: Я считаю, что почти у это работает, но там должен быть лучший способ, чтобы написать этот запрос (также, это, кажется, группируя assignments
по lead_id
):
select o.*,
(select count(*) from `leads` where {$sql_column}=o.id and `freshness`='New' and `date_created` between {$date_from} and {$date_to}) as `new`,
(select count(*) from `leads` where {$sql_column}=o.id and `freshness`='Duplicate' and `date_created` between {$date_from} and {$date_to}) as `duplicate`,
(select count(*) from `leads` where {$sql_column}=o.id and `completeness`='Partial' and `date_created` between {$date_from} and {$date_to}) as `partial`,
(select count(*) from `leads` where {$sql_column}=o.id and `completeness`='Complete' and `date_created` between {$date_from} and {$date_to}) as `complete`,
(select count(*) from `leads` where {$sql_column}=o.id and `date_created` between {$date_from} and {$date_to}) as `total`,
(select count(*) from `assignments` where `lead_id` in
(select `id` from `leads` where {$sql_column}=o.id and `date_created` between {$date_from} and {$date_to}) and `refunded`=0) as `assigned`,
(select count(*) from `assignments` where `lead_id` in
(select `id` from `leads` where {$sql_column}=o.id and `date_created` between {$date_from} and {$date_to}) and `refunded`=1) as `refunded`
from {$sql_object} as o
вы можете предоставить некоторые записи для же? –