1

Ubuntu で MySQL バージョン 5.5 を使用しています。
私のデータベーステーブルは次のように設定されています:

DDL:

    CREATE TABLE 'asx' (
        'code' char(3) NOT NULL,
        '高' 10 進数 (9,3)、
        '低' 10 進数 (9,3)、
        '閉じる' decimal(9,3),
        'histID' int(11) NOT NULL AUTO_INCREMENT,
        主キー ('histID'),
        UNIQUE KEY 'コード' ('コード')
    )

    CREATE TABLE 'asxhist' (
       '日付' 日付 NOT NULL,
       '平均' decimal(9,3),
       'histID' int(11) NOT NULL,
       PRIMARY KEY ('日付','histID'),
       キー '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.平均 |
| | アスクス | 10.000 | 9.500 | 9.800 | 11.000、9.5000 |
| | ナブ | 42.000 | 41.250 | 41.350 | 38.500,39.500 |

テーブル 2 の最新情報は、csv 形式でテーブル 1 と共に返されます。私はここまで到達することができました:

    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

一時的な回避SUBSTRING_INDEX策であり、巨大なデータの実行可能なソリューションではありません

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;

私が集めたものから、GROUP_CONCAT の制限オプションはまだ機能要求中です。

また、stackoverflowハック MySQL GROUP_CONCAT について

于 2013-01-23T11:42:36.717 に答える