2017-01-09 69 views
0

請幫我擺脫我的頭痛.. 提前,我對我的壞語言,無論是在英語和MySQL的道歉。希望有人會理解這個問題.. :)mySQL查詢在24小時內找到最低的「活躍」價格

我有一個數據庫,任何人都可以記錄各種商店的各種產品的價格。下面的查詢是一個半理論的例子,可能根本不起作用,但它被翻譯用於說明我的挑戰。 查詢應該找到最低註冊價格爲給定的$產品在過去24小時內:

SELECT img, chain.chainid, chain.chainname, shops.shopid, shoplocation, shopname, prices.price, DATE_FORMAT(price.timestamp, '%e. %M %Y, %H:%i') AS time 
FROM shops 
INNER JOIN prices ON shops.shopid = prices.shopid 
INNER JOIN chain ON shop.chainid = chain.chainid 
WHERE prices.product = '$product' 
AND timestamp > SUBTIME(NOW() , '24:0:0.000000') 
ORDER BY price, timestamp DESC 
LIMIT 1; 

我怎樣才能確保我還是找到價格最低的店,即使最便宜的店今天上午有在白天提高價格(假設我的桌子上有兩個價格),另一家商店現在最便宜?

+1

你能澄清你的問題嗎?請[編輯]它。您是否在尋找時間段內絕對最低的價格?或者你在尋找最低的當前價格?換句話說,如果產品出現新的記錄,在給定的商店價格更高,該記錄是否應取代舊記錄? –

+0

如果確實是「*在過去24小時內*」 - 那麼你的問題沒有任何意義。 –

+0

你想要一個表格兩次的結果,一次純粹按價格排序,另一個按最新排序。一個結果可以排除你的結果集中的其他結果。我會做兩個選擇並使用'UNION'。很好的問題,可惜有些人不明白。 – DanFromGermany

回答

0

你重寫的查詢:

SELECT 
    img, 
    chain.chainid, 
    chain.chainname, 
    shops.shopid, 
    shoplocation, 
    shopname, 
    prices.price, 
    DATE_FORMAT(prices.timestamp, '%e. %M %Y, %H:%i') AS time 
FROM shops 
    INNER JOIN (
    SELECT shopid, MAX(timestamp) AS timestamp 
    FROM prices 
    WHERE prices.product = '$product' 
     AND timestamp > SUBTIME(NOW(), '24:0:0.000000') 
      ) prices_tmp 
    ON prices_tmp.shopid = shops.shopid 
    INNER JOIN prices 
    ON shops.shopid = prices.shopid 
     AND prices.timestamp = prices_tmp.timestamp 
    INNER JOIN chain 
    ON shop.chainid = chain.chainid 
WHERE prices.product = '$product' 
ORDER BY price DESC 
LIMIT 1; 

注意運用prices_tmp子查詢。 雖然我不確定它是否有效。

一些解釋:在每個商店的子查詢中選擇最新價格時間戳,inner joinprices_tmp過濾舊價格,然後order by將最低價格放在最上面。

+0

查詢運行時沒有錯誤,但沒有返回行。 如果我刪除子查詢,保留子時間線並將訂單切換到ASC,它會在過去24小時內給我絕對最低的價格,未經過濾(如預期的那樣沒有子庫,粗糙)。那麼,我假設的子查詢有些不太正確? – Espen