1

我在 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 ) 或更少?(或者我可以吗?)

4

1 回答 1

0

Temporary work around using SUBSTRING_INDEX and not a feasible solution for huge data

SELECT code, high, low, close,
    (SELECT SUBSTRING_INDEX(GROUP_CONCAT(asxhist.average), ',', 3)
        FROM asxhist
        WHERE asxhist.histID = asx.histID
        ORDER BY date DESC)
FROM asx;

From what I gather Limit option in GROUP_CONCAT is still under feature-request.

Also on stackoverflow hack MySQL GROUP_CONCAT

于 2013-01-23T11:42:36.717 回答