2013-04-03 21 views
1

我一直在四處搜尋,一整天都在研究這個問題,但只是想不出來。如何加入表格並根據日期差異獲得結果限於每場比賽1次?

我有一個表trades,這個查詢涉及表上的3列:provider_id,trade_id,date_close

對於當天(指定供應商)的每次最終交易,我希望獲得先前的交易,此前的交易在...之前2天或更多時間結束,並且是當天的最終交易。例如,從這個:

+-------------+----------+---------------------+ 
| provider_id | trade_id | date_close   | 
+-------------+----------+---------------------+ 
|  126 |  1 | 2012-10-22 14:26:57 | 
|  126 |  2 | 2012-10-22 14:31:59 | 
|  126 |  3 | 2012-10-23 12:39:41 | 
|  126 |  4 | 2012-10-24 07:29:57 | 
|  126 |  5 | 2012-10-24 08:36:19 | 
|  126 |  6 | 2012-10-24 08:47:23 | 
|  126 |  7 | 2012-10-25 08:30:11 | 
|  126 |  8 | 2012-10-25 08:34:21 | 
|  126 |  9 | 2012-10-26 08:43:12 | 
|  126 |  10 | 2012-10-26 14:29:35 | 
+-------------+----------+---------------------+ 

所需的輸出會是這樣:

+-----------+---------------------+-----------+---------------------+ 
| atrade_id | adate_close   | btrade_id | bdate_close   | 
+-----------+---------------------+-----------+---------------------+ 
|   6 | 2012-10-24 08:47:23 |   2 | 2012-10-22 14:31:59 | 
|   8 | 2012-10-25 08:34:21 |   3 | 2012-10-23 12:39:41 | 
|  10 | 2012-10-26 14:29:35 |   6 | 2012-10-24 08:47:23 | 
+-----------+---------------------+-----------+---------------------+ 

這裏是我創建至今的查詢:我想設置一個LIMIT 1 DESC

SELECT a.trade_id atrade_id, MAX(a.date_close) adate_close, b.trade_id btrade_id, MAX(b.date_close) bdate_close 
FROM trades a 
INNER JOIN trades b ON a.provider_id = b.provider_id 
WHERE TIMESTAMPDIFF(DAY, DATE_FORMAT(b.date_close, "%Y-%m-%d"), DATE_FORMAT(a.date_close, "%Y-%m-%d")) >= 2 
AND a.provider_id = 126 
GROUP BY DATE_FORMAT(a.date_close, "%Y-%m-%d") 

date_close列中,以便僅獲得那些日子的最終收盤交易。但無法弄清楚如何做到這一點,所以我使用MAX()。我猜測一定有更好的辦法。此外,雖然上面的查詢得到我靠近,它返回btrade_id爲1的所有結果,而atrade_id值是關閉太:

+-----------+---------------------+-----------+---------------------+ 
| atrade_id | adate_close   | btrade_id | bdate_close   | 
+-----------+---------------------+-----------+---------------------+ 
|   4 | 2012-10-24 08:47:23 |   1 | 2012-10-22 14:31:59 | 
|   7 | 2012-10-25 08:34:21 |   1 | 2012-10-23 12:39:41 | 
|   9 | 2012-10-26 14:29:35 |   1 | 2012-10-24 08:47:23 | 
+-----------+---------------------+-----------+---------------------+ 

什麼我做錯了,或者有更好的方式,我可以去任何建議對這個?

回答

0

我建議下面的查詢應該提供所需的輸出。它使用兩個嵌套子查詢來選擇合適的平倉交易:

SELECT PREV_CLOSE.atrade_id atrade_id, 
     PREV_CLOSE.adate_close atrade_close, 
     B2.trade_id btrade_id, 
     B2.date_close bdate_close 
FROM (
    SELECT FINAL_CLOSE.provider_id, 
      A.trade_id atrade_id, 
      A.date_close adate_close, 
      MAX(B.date_close) prev_date_close 
    FROM (
     SELECT provider_id, MAX(date_close) final_date_close 
     FROM trades 
     GROUP BY provider_id, DATE(date_close) 
    ) FINAL_CLOSE 
    JOIN  trades A ON A.provider_id = FINAL_CLOSE.provider_id AND A.date_close = FINAL_CLOSE.final_date_close 
    LEFT JOIN trades B ON B.provider_id = FINAL_CLOSE.provider_id AND B.date_close < DATE(FINAL_CLOSE.final_date_close) - INTERVAL 1 DAY 
    GROUP BY FINAL_CLOSE.provider_id, A.trade_id 
) PREV_CLOSE 
JOIN trades B2 ON B2.provider_id = PREV_CLOSE.provider_id AND B2.date_close = PREV_CLOSE.prev_date_close 

因爲我認爲你的交易表可能是巨大的,你一定要在provider_iddate_close這樣創建一個索引:

ALTER TABLE `trades` ADD INDEX (`provider_id` , `date_close`); 

否則,只要您的交易表增長至數十甚至數十萬條記錄,您的查詢就不太可能終止。

+1

謝謝您的回覆!我將需要研究你對這個查詢做了什麼,因爲它的水平遠遠高於我目前使用MySQL的能力。我已經測試過它,並且可以確認它的功能就像是一種魅力。 爲了得到我想要的輸出,我已將此添加到查詢的末尾: 'WHERE B2.provider_id = 126 ORDER BY atrade_id' – bg155

+0

還有,你是正確的,該表將是巨大的。我有一個關於provider_id的FOREIGN KEY和目前的date_close上的INDEX。我希望這將有助於加快速度。我目前在桌子上有近3500行,但它會達到幾十萬。目前這個查詢大約需要1.4秒。很抱歉,我無法投票回覆您的回覆,因爲我的名聲尚未達到。 – bg155

+0

不客氣,很高興幫助:)優化,我會嘗試不同的索引,例如添加(provider_id,date_close)索引並查看查詢需要多長時間,當然還可以使用EXPLAIN SELECT PREV_CLOSE.atrade_id ...查看哪些索引是由MySQL選擇的。 – Marcellus

相關問題