2017-04-06 54 views
0

我想从按特定顺序排序的表中选择值。从表中按特定顺序从另一个表中排序值

我有一个名为test的表,看起来像这样:

| date  | code  | value | 
+----------+-----------+----------+ 
| 20050104 | 000005.SZ | -6359.19 | 
| 20050104 | 600601.SH | -7876.34 | 
| 20050104 | 600602.SH | -25693.3 | 
| 20050104 | 600651.SH | NULL | 
| 20050104 | 600652.SH | -15309.9 | 
... 
| 20050105 | 000005.SZ | -4276.28 | 
| 20050105 | 600601.SH | -3214.56 | 
... 
| 20170405 | 000005.SZ | 23978.13 | 
| 20170405 | 600601.SH | 32212.54 | 

现在我只想选择一个日期,说日期= 20050104,然后按一定顺序(顺序的数据进行排序每只股票都在股市上市)。

我有另一个表称为stock_code存储正确的顺序:

+---------+-----------+ 
| code_id | code  | 
+---------+-----------+ 
|  1 | 000002.SZ | 
|  2 | 000004.SZ | 
|  3 | 600656.SH | 
|  4 | 600651.SH | 
|  5 | 600652.SH | 
|  6 | 600653.SH | 
|  7 | 600654.SH | 
|  8 | 600602.SH | 
|  9 | 600601.SH | 
|  10 | 000005.SZ | 
... 

我想通过分类stock_code(code_id)所选择的数据,但我不希望使用加入,因为它需要太多时间。有什么想法吗?

我试图使用字段,但它给了我一个错误,请告诉我如何纠正它或给我一个更好的主意。

select * from test 
    where date = 20050104 and code in (select code from stock_code order by code) 
    order by field(code, (select code from stock_code order by code)); 

Error Code: 1242. Subquery returns more than 1 row 

回答

1

你告诉我们,你不想加入,因为它需要太多的时间,但下面的连接查询这里可能是最好的选择:

SELECT t.* 
FROM test t 
INNER JOIN stock_code sc 
    ON t.code = sc.code 
WHERE t.date = '20050104' 
ORDER BY sc.code_id 

如果这真的运行速度慢,那么你应该检查以确保你的索引设置在适当的列上。在这种情况下,来自两个表格的code列索引以及test.date索引应该非常有用。

ALTER TABLE test ADD INDEX code_idx (code) 
ALTER TABLE test ADD INDEX date_idx (date) 
ALTER TABLE code ADD INDEX code_idx (code) 
+0

感谢您的帮助,建立索引会后hepls了很多,但我每次添加索引花费的时间光60秒钟......因为我的表中有大约900万行,我有表十万只像那样......有点难以忍受...... –

+0

@DirkPaul但是你打算更新表格的频率如何? –