我正在尝试对2表联接运行计数查询。 e_amazing_client表具有百万个条目/行,而m_user仅具有50行,但是查询计数将永远占用!
SELECT COUNT(`e`.`id`) AS `count`
FROM `e_amazing_client` AS `e`
LEFT JOIN `user` AS `u` ON `e`.`cx_hc_user_id` = `u`.`id`
WHERE ((`e`.`date_created` >= '2018-11-11') AND (`e`.`date_created` >= '2018-11-18')) AND (`e`.`id` >= 1)
我不知道此查询出了什么问题?任何帮助将不胜感激。
答案 0 :(得分:0)
首先,我猜这已经足够了:
SELECT COUNT(*) AS `count`
FROM e_amazing_client e
WHERE e.date_created >= '2018-11-11' AND e.id >= 1;
如果user
只有50行,我怀疑它正在创建重复项。 date_created
上的比较是多余的。
对于此查询,请尝试在e_amazing_client(date_created, id)
上创建索引。
答案 1 :(得分:0)
也许您想要这个:
SELECT COUNT(`e`.`id`) AS `count`
FROM `e_amazing_client` AS `e`
LEFT JOIN `user` AS `u` ON `e`.`cx_hc_user_id` = `u`.`id`
WHERE ((`e`.`date_created` >= '2018-11-11') AND (`e`.`date_created` <= '2018-11-18')) AND (`e`.`id` >= 1)
检查日期之间?
另外,您真的需要
AND (`e`.`id` >= 1)
如果id
是表中通常的id,是否存在<1
的情况?
答案 2 :(得分:0)
您的查询将在2018-11-11或之后提取所有记录,因为您的WHERE子句的ID> = 1您那里没有特定用户的子句。您还具有基于> = 2018-11-18的日期的原始查询。您可能已经说过,您只希望在11/11周至11/18周内进行计数,此时符号应该>> 11-11和<= 11-18。
关于计数,您得到的是所有人(假设没有条目的ID小于1),因此该日期范围内的计数。如果您希望按指示的每个用户使用它,则需要按cx_hc_user_id(用户)列分组以查看谁拥有最多的用户,或者将WHERE子句的用户部分包含在内以得到一个人。
SELECT
e.cx_hc_user_id,
count(*) countPerUser
from
e_amazing_client e
WHERE
e.date_created >= '2018-11-11'
AND e.date_created <= '2018-11-18'
group by
e.cx_hc_user_id
您可以按递减的顺序进行排序,以使用户获得最高的计数,但仍不能肯定您的要求。