2011-08-02 31 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) 

這種工作速度快。