好的,我已经阅读了所有相似的主题,但仍然无法自己解决这个问题。
我的问题: 我正在尝试为股票(价格,指数)做一个相对表现表。 我需要在这里使用我的数据库中的这两个表。
第一桌:
股票名称
我查询此表以获取数据库中的所有股票名称。
例如:
Array
(
[0] => LT0000102337
[1] => EE3100034653
[2] => EE3100003609
[3] => EE3800046643
[4] => LT0000127375
[5] => LV0000100659
[6] => LV0000100501
)
第二桌:
我的股票的指数值(例如EV或EBITDA或P / E)
将所有股票存储在以i和股票编号(即iLT0000102337或iEE3100034653)开头的不同表格中。
结构是:
id | ev | ebitda | pe
23 | 12 | 141322 | 15
假设我有股票的股票编号,我需要获得最后一个ID及其索引(例如ev = 12)。
现在我需要从其他股票指数表中获得四行,其中ev最接近12和其他4的ev大于12.最大的id表示最新值,我只需要那些。 所以即一只股票的最大id为10,另一只股票为11,另一只股票为15等,所以我需要得到10,1.10,10.5,11.5, 12 ,14,15,18 ,22。
我有非常复杂的表结构,我想这就是使它变得困难的原因。
为了把它全部放在一张桌子里,我使用了UNION,但现在我不得不排名那些。
foreach($instrumentsm as $instrumentm) {
$sqlxm .= "(SELECT id, ev, '$instrumentm' as name FROM i".$instrumentm." ORDER BY id DESC LIMIT 1)";
if ($i<count($instrumentsm)-1){
$sqlxm .= " UNION ";
$i++;
}
}
$sqlxm .= " ORDER BY ev DESC";
这会创建一个像这样的查询:
(SELECT id, ev, 'LT0000102337' as name
FROM iLT0000102337
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'EE3100034653' as name
FROM iEE3100034653
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'EE3100003609' as name
FROM iEE3100003609
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'EE3800046643' as name
FROM iEE3800046643
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'LT0000127375' as name
FROM iLT0000127375
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'LV0000100659' as name
FROM iLV0000100659
ORDER BY id DESC LIMIT 1)
UNION (SELECT id, ev, 'LV0000100501' as name
FROM iLV0000100501
ORDER BY id DESC LIMIT 1)
ORDER BY ev DESC
现在,我使用最好的算法做这个以及如何进行相对性能比较? 谢谢!
答案 0 :(得分:0)
我最大的建议是更好地规范化您的数据。 (我不知道关于股票的第一件事,所以如果我误解了什么,请原谅我。)
首先,不要在一个表中使用单个列来保存外键,该外键是另一个表中多个列的组合。相反,在每个表中都有一个id列。 (您可以忽略该列,直到您需要它为止,迟早,您将最终需要它。)
然后,对于“子”表中的每个条目,存储“父”表中的“父”的id。
表1(股票名称)可能包含以下列:
id,姓名,特殊信息
表2(索引值)将包含一个用于保存外键的列,该外键将其链接回库存名称:
id,stock_name_id,stock_id,stock_ebitda,stock_ev,stock_pa
在stock_name_id字段中,您输入与其所属名称对应的ID。
顺便说一下,这些id列都应该是自动编号主键。