2012-05-29 76 views
0

我有以下表格:查詢幫助(的foreach循環)

items(itemid, itemName, catid) 

categories (catid, catname) 

prices (itemid, open_price, close_price) 
  • 每個項目屬於1類只
  • 每個項目只有1個open_price,在價格表close_price行

如果我有10個類別,每個類別有10個項目,我如何找到每個類別中價格變化最大的公司。

我目前有一個PHP循環運行並抓住每個類別的頂級表現,但想知道是否有辦法更有效地做到這一點。

感謝

代碼:

foreach category, run the following query:

SELECT c.itemid, c.itemname ,

100.0 * (cp.close_price - cp.open_price)/ IFNULL(cp.open_price,1) AS overall_change

FROM prices cp

LEFT JOIN items c ON c.itemid = prices.itemid

WHERE c.catid=8 ORDER BY overall_change DESC LIMIT 1;

+0

你想要在PHP循環中或在查詢之前完成工作? –

+0

如果你有一個有效的PHP循環來完成任務,但你想要更有效率的東西,也許你可以告訴我們你已經擁有的代碼,因爲它會幫助你更好地理解你想要達到的目標以及你有多遠到目前爲止。 – Spudley

+0

@Spudley我很想在mysql中做所有的工作 – ssj1980

回答

0

如果你不介意畫(當兩個項目是一類的頂部)

SELECT 
    cat.catid, 
    cat.catname, 
    c.itemid, 
    c.itemname , 
    100.0 * (cp.close_price - cp.open_price)/ IFNULL(cp.open_price,1) AS overall_change  
FROM 
    categories AS cat 
JOIN  
    items AS c 
    ON cat.catid = c.catid 
JOIN 
    prices AS cp 
    ON c.itemid = cp.itemid 
JOIN 
    (SELECT 
     c.catid, 
     MAX(100.0 * (cp.close_price - cp.open_price)/ IFNULL(cp.open_price,1)) AS overall_change 
    FROM 
     items AS c 
    JOIN 
     prices AS cp 
     ON c.itemid = cp.itemid 
    GROUP BY 
     c.catid 
    ) AS max 
    ON cat.catid = c.catid 
    AND max.overall_change = (100.0 * (cp.close_price - cp.open_price)/ IFNULL(cp.open_price,1)) 
ORDER BY 
    cat.catid 

...我沒有測試此:)