2011-12-21 43 views
-1

我有一个文本文件,我每个月都会解析并将数据插入到数据库中。文本文件看起来像这样。选择要插入数据库的条款,以便稍后查询记录

------------------------------------------------------------------------------------------------------------------------------------------------------------ 
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,我只会增加一个数字。如果更大的飞机需要更多乘务员停车位,这将允许以后扩展。因此,回顾一下,我将为每个数据库记录保存一个以下内容。

  • “CAFO”
  • “CA”
  • “FO”
  • “1”
  • “2”

现在我需要访问数据库和检索这些记录我的网络程序。如果队长想要收回记录,他只会希望队长线路是“CAFO”或“CA”。第一军官的情况恰恰相反。 当我进行查询时,我发现我可以使用mySQL命令SUBSTRING来获取前2或后2个字符。

为队长线

选择Line_numberhtml_text FROM lines WHERE SUBSTRING(Crew_type,1,2)= “CA”

这只是得到从记录中第一个开头两个字符它会匹配这两种情况。 对于第一官员,我开始在字符串的末尾,并抓住最后两个字符。

SELECT Line_numberhtml_text FROM lines WHERE SUBSTRING(Crew_type,-2)= “FO”

对于乘务员我可以比较的数量。 如果乘务员只想要1个位置的线路。

选择Line_numberhtml_text FROM lines WHERE Crew_type = “1”

或者,如果他们希望所有可能的乘务员职位

选择Line_numberhtml_text FROM lines WHERE Crew_type> =“ 1“

我会将列类型设置为ENUM,并使用上面列出的值。

我的问题是否有更好的方法来解决这个问题?我只会插入一次,但会受到很大的影响。 SUBSTRING命令是否会减慢查询速度?

回答

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某处IW将定义

$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'

+0

谢谢。解决方案简单 – jmm 2011-12-22 01:26:20