【发布时间】:2016-08-23 03:42:44
【问题描述】:
我正在尝试对同一查询中的多个表进行计数,但其中 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
如何在不使用子选择中的子选择的情况下更正此问题(这对性能来说很糟糕)?
编辑:我相信我几乎可以完成这项工作,但必须有更好的方法来编写此查询(另外,它似乎是通过 lead_id 对 assignments 进行分组):
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
【问题讨论】:
-
你能提供一些相同的记录吗?
标签: mysql select count subquery