从表中选择按另一个表中某个顺序排序的值

时间:2017-04-06 03:13:02

标签: mysql sorting sql-order-by

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

我有一个名为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)对所选数据进行排序,但我不想使用join,因为它需要花费太多时间。有什么想法吗?

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

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 个答案:

答案 0 :(得分: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)