Php 优化MySQL代码

Php 优化MySQL代码,php,mysql,sql,Php,Mysql,Sql,有人能告诉我如何改进这样的查询,使它运行得尽可能快,而且更干净吗?正如你所看到的,我有两个完全相同的选择,但我需要能够从中获得计数,所以我不确定什么是最好的方式来改变这样的事情: SELECT COUNT(*) AS count FROM users WHERE users.activated = '1' AND (SELECT TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) FROM users AS users2 WHERE users2.id = use

有人能告诉我如何改进这样的查询,使它运行得尽可能快,而且更干净吗?正如你所看到的,我有两个完全相同的选择,但我需要能够从中获得计数,所以我不确定什么是最好的方式来改变这样的事情:

SELECT COUNT(*) AS count FROM users
WHERE users.activated = '1'
AND (SELECT TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) FROM users AS users2 WHERE users2.id = users.id) >= '18' 
AND (SELECT TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) FROM users AS users2 WHERE users2.id = users.id) <= '28'
这一个获得了从我通过的$c_lat和$c_lng到1000米到5000米之间的所有用户

只是想了解在MySQL中解决此类问题的最佳方法是什么


谢谢

我看不出有什么理由为此使用子查询。编写查询的更好方法是:

SELECT COUNT(*) AS count
FROM users u
WHERE u.activated = '1' AND
      u.birthdate <= date_sub(CURDATE(), interval 18 years) AND
      u.birthdate >= date_sub(CURDATE(), interval 28 years);
选择COUNT(*)作为计数
来自用户u
其中u.activated='1'和
u、 出生日期=日期(CURDATE(),间隔28年);
如前所述,此查询可以利用
用户(已激活,生日)
上的索引。特别是,第二个条件最好写为:
u.birthdate>date\u sub(CURDATE(),interval 29 years)


注意:日期算术的确切逻辑可能有点不正确。“18到28岁之间”的确切含义尚不清楚。对于第二个示例,您可以尝试以下方法:

SELECT
    COUNT(*) AS count,
    ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) AS var_one,
    ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) AS var_two
FROM
    users
HAVING
    var_one >= 1000
    AND var_two <= 5000;  

这将显示交易记录大于10的产品,在低和高之间

iirc
将适用于日期类型。好的,我的示例有点不好,这只是一个示例,我还有其他子查询会重复并执行相同的事情2次,有没有办法避免这样的事情,使它不会执行相同的事情2次?比如,有没有一种方法可以只获取一次年龄,然后在where子句中使用它,次数可以达到我想要的次数?谢谢@存在。只能回答你提出的问题。如果你还有其他问题,请作为另一个问题提问。示例数据和期望的结果非常有用。更新了我上面的问题,以便您可以了解我的意思。我的问题更一般,关于如何解决这些问题,因此我不会运行完全相同的代码2次。非常感谢。考虑到您对第一个答案的评论,这个问题太宽泛了,无法给出一个好的答案,但一个相当通用的问题是:请参见SELECT子句示例中的
SQL相关子查询
at Hmm,我以前尝试过类似的方法,但最终没有使用它,因为它看起来相当慢,据我所知,HAVING将在查询结束时不进行任何优化而运行,因此它的运行速度会变慢,有没有其他方法不使用HAVING子句来实现这一点?谢谢
SELECT
    COUNT(*) AS count,
    ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) AS var_one,
    ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) AS var_two
FROM
    users
HAVING
    var_one >= 1000
    AND var_two <= 5000;  
SELECT
    p.productID, 
    p.productName,
    COUNT(t.productID) AS transCount
FROM
    product p
    INNER JOIN transaction t ON t.productID = p.productID
HAVING
    transCount > 10;