我有一个文本文件,我每月解析并将数据插入我的数据库。文本文件如下所示。
------------------------------------------------------------------------------------------------------------------------------------------------------------ BLK. NO 410 | 1 2| 3 4 5 6 7 | 8 9| 10 11 12 13 14 |15 16| 17 18 19 20 21 |22 23| 24 25 26 27 28 |29 30| 31 1 2 BLK 88.35 |SA SU| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU| MO TU WE CR. 88.35 |194 / 159 | |194 / 159 | |194 / 159 | |194 / 159 | |239 OFF 14 : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : CUU DFW C/O 06.00 TAFB 216.15 194=/1410/1055/0740, 159=/0900/1700/1400, 239=/1845/1945/0155 EM3 25.55 ERD 42.00 EM4 20.40 -----------------------------------------------------------------------------------------------------------------------------
此文本文件包含100到300条记录(我们将其称为“飞行线”),我用它来确定每个月的航班时刻表。我正在解析这个文件很好,但该公司增加了一个新的皱纹。
这条“线”可以是飞行员或空乘人员。直到最近,每条线路都可以用于上尉或副驾驶。但是现在有些文件有队长和副队长。空乘人员档案可能有1或2个空乘人员位置或更多,具体取决于飞行的飞机类型。
我需要在我的数据库中创建一个反映这些新信息的新列。将行保存到数据库后,只会搜索它们,而不会再次更新。我不想添加新表只是为了跟踪这些信息。我想在现有表中添加一个新列。这是我的策略。
当我解析文本文件时,我会跟踪可用的位置。如果是Captain,我会将“CA”保存到数据库中。如果是副驾驶,我将保存“FO”。如果是船长和副驾驶,我将保存“CAFO”。对于乘务员,我将为1名空乘人员保存一个“1”号码。对于每个额外的poistion,我只会增加一个数字。如果更大的aiplanes需要更多乘务员的话,这将允许以后扩展。
回顾一下,我将为每个数据库记录保存以下内容。
现在我需要访问数据库并检索我的Web程序的这些记录。如果船长想要检索记录,他将只想要“CAFO”或“CA”的船长线。对于第一批军官来说恰恰相反。 当我进行查询时,我发现我可以使用mySQL命令SUBSTRING来获取前2个或后2个字符。
为队长线
SELECT
Line_number
,html_text
FROMlines
WHERE SUBSTRING(Crew_type
,1,2)=“CA”
这只会从记录中获取前两个开头字符,它将匹配两种情况。 对于第一批人员,我从字符串末尾开始,抓住最后两个字符。
SELECT
Line_number
,html_text
FROMlines
WHERE SUBSTRING(Crew_type
, - 2)=“FO”
对于乘务员,我可以比较一下这个号码。 如果空乘人员只想要1个位置的线路。
SELECT
Line_number
,html_text
FROMlines
WHERE Crew_type =“1”
或者,如果他们想要所有可能的乘务员职位
SELECT
Line_number
,html_text
FROMlines
WHERE Crew_type> =“1”
我会使用上面列出的值将列类型设置为ENUM。
我的问题是有更好的方法来解决这个问题吗?我只会插入一次,但会进行很多修复。 SUBSTRING命令会不会太慢查询查询?
答案 0 :(得分:0)
SELECT Line_number,html_text FROM lines WHERE SUBSTRING(Crew_type,1,2)="CA"
将成为性能杀手,因为它计算所有记录的子字符串,而不仅仅是那些使用的记录。你想要
SELECT Line_number,html_text FROM lines Crew_type in ("CA", "CAFO")
与FO同上。
所以PHP中的某个地方会定义
$matches=array(
'CA'=>'"CA","CAFO"',
'FO'=>'"FO","CAFO"',
'FA'=>'"1","2"'
);
然后使用
$match=$matches[$crew_type];
$sql="SELECT Line_number,html_text FROM lines Crew_type in ($match)";
$ crew_type是'CA','FO','FA'之一