2011-08-02 26 views
1

我有一个PHP文件下面的查询:我怎么能减去值一行从值在另一排在同一个MySQL表

$query = "SELECT 
    a.aurl as al, 
    (a.lttotals 
     - 
     (SELECT b.lttotals 
     FROM stats b 
     WHERE ltdate='$newdate' 
     AND b.aurl=a.aurl 
     ) 
    ) as tt, 
    lttotals 
FROM stats a 
WHERE ltdate='$date' 
ORDER BY lttotals DESC 
LIMIT 20"; 

这是非常缓慢的,如果我改变了极限到20多个mysql就消失了。 ;)

基本上我需要做的是从一行中的某些列中取值并从另一行中减去它们。

有没有更好的方法来做我正在尝试使用我现在或现在应该重构的数据?

+1

您是否考虑过自加入而不是子查询?这些通常表现更好。另外,如果表中的两个以上的行具有相同的aurl值,会发生什么情况? – JohnFx

+0

看看这里的灵感:http://stackoverflow.com/q/6910199/27535涉及多少行)你如何配对行?样品数据也请... – gbn

+0

'(aurl,ltdate)'是您餐桌上的独特组合吗?如果不是,则查询可能会失败。 – Quassnoi

回答

0
SELECT a.url AS al, 
    (a.lttotals - b.lttotals) AS tt, 
    a.lttotals 
FROM stats a, stats b 
WHERE a.ltdate='$date' AND b.ltdate='$newdate' AND a.url = b.url 
ORDER BY a.lttotals DESC 
1
SELECT a.aurl AS a1, 
     a.lttotals 
     a.lttotals - b.lttotals 
FROM stats a 
JOIN stats b 
ON  b.aurl = a.aurl 
     AND b.ltdate = '$newdate' 
WHERE a.ltdate = '$date' 
ORDER BY 
     a.lttotals DESC 
LIMIT 20 

创建以下指标:

stats (ltdate, lttotals) 
stats (ltdate, aurl) 

这种工作速度快。