2013-01-23 37 views
1

我在Ubuntu上使用MySQL 5.5版本。
我的数据库表是设置如下:SQL算法尽可能接近线性时间并调整select语句

 

DDLs: 

    CREATE TABLE 'asx' (
     'code' char(3) NOT NULL, 
     'high' decimal(9,3), 
     'low' decimal(9,3), 
     'close' decimal(9,3), 
     'histID' int(11) NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY ('histID'), 
     UNIQUE KEY 'code' ('code') 
    ) 

    CREATE TABLE 'asxhist' (
     'date' date NOT NULL, 
     'average' decimal(9,3), 
     'histID' int(11) NOT NULL, 
     PRIMARY KEY ('date','histID'), 
     KEY 'histID' ('histID'), 
     CONSTRAINT 'asxhist_ibfk_1' FOREIGN KEY ('histID') REFERENCES 'asx' ('histID') 
     ON UPDATE CASCADE 
    ) 

t1: 

| code | high | low | close | histID (primary key)| 
| asx | 10.000 | 9.500 | 9.800 | 1  
| nab | 42.000 | 41.250 | 41.350 | 2  

t2: 

| date  | average | histID (foreign key) | 
| 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     | 

I am attempting to complete a select query that produces this as a result: 

| code | high | low | close | asxhist.average | 
| asx | 10.000 | 9.500 | 9.800 | 11.000, 9.5000 | 
| nab | 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的第一个最大行数每组在sql的解决方案,但我整天都在b my我的脑袋,而这种轻微的w seems似乎在淡化我理解我应该如何使用它的能力效益。我怎样才能将结果限制到最近的5个值,并且考虑到这些表最终会是兆字节大小,请尝试并保留在O(n )或更少? (或者可以吗?)

+0

我不明白你的数据的表示。考虑提供适当的'DDL'。 – Strawberry

+0

...具有正确代表性的数据。 – Strawberry

+0

K我将在DDLs上工作,同时填写更多内容以使其更清晰 – aarontt

回答

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尚在功能的要求。

同样在计算器hack MySQL GROUP_CONCAT

+0

这是一个耻辱没有解决办法,欢呼的答案,这是我的解决方案在此期间。还不能+1 :(! – aarontt