我在 Ubuntu 上使用 MySQL 5.5 版。
我的数据库表设置如下:
DDL:
创建表'asx'(
'代码' char(3) NOT NULL,
'高'十进制(9,3),
'低'十进制(9,3),
'关闭'十进制(9,3),
'histID' int(11) NOT NULL AUTO_INCREMENT,
主键('histID'),
唯一键“代码”(“代码”)
)
创建表'asxhist'(
'日期' 日期不为空,
'平均'十进制(9,3),
'histID' int(11) 非空,
主键('日期','histID'),
KEY 'histID' ('histID'),
约束“asxhist_ibfk_1”外键(“histID”)参考“asx”(“histID”)
更新级联
)
t1:
| 代码 | 高 | 低 | 关闭 | histID(主键)|
| 阿克斯 | 10.000 | 9.500 | 9.800 | 1
| 抓住 | 42.000 | 41.250 | 41.350 | 2
t2:
| 日期 | 平均 | histID (外键) |
| 2013-01-01| 10.000 | 1 |
| 2013-01-01| 39.000 | 2 |
| 2013-01-02| 9.000 | 1 |
| 2013-01-02| 38.000 | 2 |
| 2013-01-03| 9.500 | 1 |
| 2013-01-03| 39.500 | 2 |
| 2013-01-04| 11.000 | 1 |
| 2013-01-04| 38.500 | 2 |
我正在尝试完成一个产生此结果的选择查询:
| 代码 | 高 | 低 | 关闭 | asxhist.average |
| 阿克斯 | 10.000 | 9.500 | 9.800 | 11.000, 9.5000 |
| 抓住 | 42.000 | 41.250 | 41.350 | 38.500,39.500 |
表 2 中的最新信息与表 1 以 csv 格式返回。我设法做到了这一点:
SELECT code, high, low, close,
(SELECT GROUP_CONCAT(DISTINCT t2.average ORDER BY date DESC SEPARATOR ',') FROM t2
WHERE t2.histID = t1.histID)
FROM t1;
不幸的是,这会返回与 hID 关联的所有值。我正在查看 xaprb.com 的 firstleastmax-row-per-group-in-sql 解决方案,但我整天都在敲我的头,轻微的头晕似乎正在削弱我理解我应该如何使用它的能力益处。如何将结果限制为最近的 5 个值,并考虑到表的大小最终将是兆字节,尝试保持在 O(n 2 ) 或更少?(或者我可以吗?)