Php 与MySQL中表的比较

Php 与MySQL中表的比较,php,mysql,optimization,Php,Mysql,Optimization,所以我研究查询已经有几年了, 有时我会问自己是否有更简单的方法, 或者是一种更复杂的方法来实现它。所以今天我遇到了一个情况,我有一个表,比如说用户,我想和这个表做一些比较 在这种情况下,从我拥有的每个用户那里获取一个统计信息:了解他下了多少订单,或者在指定的时间段内他在愿望列表中有多少产品;例如上周和本周。 所以我想知道的是,最好的方法是使用左连接,以及ifs,如下所示: SELECT users.id, SUM(IF(wishlist.date = LAST_WEEK, 1, 0)) LAS

所以我研究查询已经有几年了, 有时我会问自己是否有更简单的方法, 或者是一种更复杂的方法来实现它。所以今天我遇到了一个情况,我有一个表,比如说用户,我想和这个表做一些比较

在这种情况下,从我拥有的每个用户那里获取一个统计信息:了解他下了多少订单,或者在指定的时间段内他在愿望列表中有多少产品;例如上周和本周。 所以我想知道的是,最好的方法是使用
左连接
,以及
ifs
,如下所示:

SELECT 
users.id,
SUM(IF(wishlist.date = LAST_WEEK, 1, 0)) LAST_WEEK_WISHLIST,
SUM(IF(wishlist.date = THIS_WEEK, 1, 0)) THIS_WEEK_WISHLIST,
SUM(IF(orders.date = LAST_WEEK, 1, 0)) LAST_WEEK_ORDERS,
SUM(IF(orders.date = THIS_WEEK, 1, 0)) THIS_WEEK_ORDERS
FROM
users
LEFT JOIN wishlist ON users.id = wishlist.user_id
LEFT JOIN orders ON users.id = orders.user_id
... 
GROUP BY users.id
ORDER BY users.id ASC
…或者有更好或更优化的方法来实现这一点


提前感谢

我建议尝试使用子查询,而不是加入,这可能会有所不同

下面是我如何解决这个问题的一个例子

SELECT l_outer.Locations_LocationID, l_outer.Locations_LocationName,

ifnull((SELECT format(sum(replace(Payments_Amount, '$', '')), 2) as card_total
    FROM Payments as p
    where p.Payments_PaymentItem in ('Visa', 'MasterCard', 'Discover') AND p.Payments_LocationID = l_outer.Locations_LocationID AND STR_TO_DATE(Payments_Date, '%m/%d/%Y') >= DATE_SUB(curdate(),INTERVAL (DAY(curdate())-1) DAY)
    group by p.Payments_LocationID), 0.00) Cards,

ifnull((SELECT format(sum(replace(Payments_Amount, '$', '')), 2) as AmericanExpress_total
    FROM Payments as p
    where p.Payments_PaymentItem = 'American Express' AND p.Payments_LocationID = l_outer.Locations_LocationID AND STR_TO_DATE(Payments_Date, '%m/%d/%Y') >= DATE_SUB(curdate(),INTERVAL (DAY(curdate())-1) DAY)
    group by p.Payments_LocationID), 0.00) AmericanExpress

From Locations as l_outer

请为3个表提供
SHOW CREATE TABLE
,并告诉我们这些表有多大。另外,较旧的数据是“静态”的吗?也就是说,我们可以汇总旧数据,只需“计算”当前数据吗?创建表用户(用户id INT NOT NULL自动增量、电子邮件VARCHAR(80)NOT NULL、显示名称VARCHAR(50)NOT NULL、密码字符(41)NOT NULL、主键(用户id)、唯一索引(电子邮件))引擎=INNODB;创建表wishlist(用户id INT NOTNULL、产品id INT NOTNULL、外键(用户id)引用用户(用户id)、外键(产品id)引用产品(产品id))创建表订单(id INT NOTNULL、pid INT NOTNULL、订单编号INT NOTNULL、主键(id)、约束FKU订单\U用户外键(pid)引用用户(id))添加
WHERE orders.date>=NOW()-间隔2周和…
将使其运行更快。