我一直在四處搜尋,一整天都在研究這個問題,但只是想不出來。如何加入表格並根據日期差異獲得結果限於每場比賽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 |
+-----------+---------------------+-----------+---------------------+
什麼我做錯了,或者有更好的方式,我可以去任何建議對這個?
謝謝您的回覆!我將需要研究你對這個查詢做了什麼,因爲它的水平遠遠高於我目前使用MySQL的能力。我已經測試過它,並且可以確認它的功能就像是一種魅力。 爲了得到我想要的輸出,我已將此添加到查詢的末尾: 'WHERE B2.provider_id = 126 ORDER BY atrade_id' – bg155
還有,你是正確的,該表將是巨大的。我有一個關於provider_id的FOREIGN KEY和目前的date_close上的INDEX。我希望這將有助於加快速度。我目前在桌子上有近3500行,但它會達到幾十萬。目前這個查詢大約需要1.4秒。很抱歉,我無法投票回覆您的回覆,因爲我的名聲尚未達到。 – bg155
不客氣,很高興幫助:)優化,我會嘗試不同的索引,例如添加(provider_id,date_close)索引並查看查詢需要多長時間,當然還可以使用EXPLAIN SELECT PREV_CLOSE.atrade_id ...查看哪些索引是由MySQL選擇的。 – Marcellus