2012-03-27 37 views
0

MySQL照片库脚本要求我通过将每个图像标题与表示所需顺序的数字进行配对来提供图库的显示顺序。MySQL:对文件关联中的行重新排序


我有一个列表的正确排序称为pairs_list.txt数据,看起来像这样:

# title   correct data in list 
-- ------- 
1 kmmal 
2 bub14 
3 ili2 
4 sver2 
5 ell5 
6 ello1 
... 

所以,kimmals图像将被首先显示,然后是bub14图像等


我的MySQL表名为title_order与上面的标题相同,但它们没有与正确的数字配对:

# title   bad data in MySQL 
-- ------- 
14 kmmal 
100 bub14 
31 ili2 
47 sver2 
32 ell5 
1 ello1 
... 

我怎样才能使一个MySQL脚本,将着眼于正确的号码,标题配对从pairs_list.txt和经历的title_order每一行,用正确的号码替换每一行?换句话说,我怎样才能使MySQL表的顺序看起来像文本文件的顺序?

在伪代码,它可能看起来像这样的事情:

  1. 获得MySQL单行标题
  2. 搜索pair_list.txt这个标题
  3. 获取列表中正确的数字标题对
  4. 用正确的数字替换MySQL号码
  5. 重复所有行

谢谢你的帮助!

+0

[你有什么试过](http://mattgemmell.com/2008/12/08/what-have-you-tried/)? – ghoti 2012-03-27 03:51:43

+0

你需要表格中的任何当前数据吗?如果不是,只需从title_order中删除然后插入为CSV即可。 – 2012-03-27 03:52:37

+0

@ghoti我还没有尝试过什么,因为我真的不知道如何解决这个问题。我在网上查看了其他资源,但他们没有谈及基于文件轻松重新排序MySQL表。虽然,我想你可以在PHP中做到这一点...... – 2012-03-27 03:56:04

回答

1

如果这不是一次性的任务,但会经常调用的函数,那么也许你可以有以下情形:

  1. 创建一个临时表,从pairs_list.txt所有的值插入此温度表使用mysql load data infile函数。
  2. 在该临时表上创建一个过程(或插入触发器可能?),它将根据插入的内容更新主表。 (或插入触发器),我会有一个游标获取临时表中的所有值,并且该游标的每个值都会更新主表上的选定标题。
  3. 从该临时表中删除所有
+0

在这种情况下,您的程序应该执行一个填充文件名的加载数据命令,然后应该使用参数调用过程名称。多个用户同时做同样的事情也很重要。然后,可能需要为过程调用提供事务ID或用户名。 – tartar 2012-03-27 04:04:53

+0

感谢塔塔。我会尽力做出这样的功能。 – 2012-03-27 04:08:52

1

我建议你做这个简单的方法 -

title_order表中删除所有主键和外键,并创建唯一索引(或主键)上title字段 -

ALTER TABLE title_order 
    ADD UNIQUE INDEX UK_title_order_title (title); 

使用LOAD DATA INFILE与REPLACE选项加载的DAT从文件中取出并替换 -

LOAD DATA INFILE 'pairs_list.txt' 
    REPLACE 
    INTO TABLE title_order 
    FIELDS TERMINATED BY ' ' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 2 LINES 
    (@col1, @col2) 
    SET order_number_field = @col1, title = TRIM(@col2); 

...在LOAD DATA INFILE命令中指定您需要的属性。