依靠JOIN查询的SQL需要永远执行吗?

时间:2018-11-18 13:14:19

标签: mysql sql database mysqli phpmyadmin

我正在尝试对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)

我不知道此查询出了什么问题?任何帮助将不胜感激。

3 个答案:

答案 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

您可以按递减的顺序进行排序,以使用户获得最高的计数,但仍不能肯定您的要求。