2012-03-06 32 views
1

分开后,我有一个MySQL表看起来像这样:PHP排序姓氏的数组由空格在镆铘

id author public image1 image2 image3 bio media1 media2 media3 media4 media5 media6 

外地“作者” normaly已经名字(Secondname)姓氏用空格分隔。 如何在姓氏后对数组进行排序,并且如果在此之后只有一个名字存在。

这是我用来在作者之后排序的modx查询,但显然它不使用姓。

$c = $modx->newQuery('AuthorDe'); 
    $c->sortby('author','ASC'); 
    $authors = $modx->getCollection('AuthorDe',$c); 

回答

2

你搬起石头砸自己的脚,现在,一对夫妇的原因:

  • 当只有一个字符串中的字,排序是很难预测。
  • 由于某种原因,您有数据索引。他们使它更快地变成a lot。使用字符串函数强制进行表扫描。对于100个数据单元来说足够好,对于10000行,'数据库去假期'的速度慢1000000.
  • 下一次你必须使用作者字段,你意识到你必须把它分解成单词,你也必须理解并修复旧的上面这个代码片断

尽管如此 - 我没有测试它 - 但试试这个:

$c->sortby('substring_index(author," ",-1)','ASC'); 
+0

谢谢你 - 。这个作品也谢谢你给出性能建议。我不想重写网站的其他部分 - 这很难看,但它很有用。 – Johannes 2012-03-06 21:23:06

+0

另外要注意,任何人阅读本:镆铘允许你很容易标准化的数据分成不同的表,你的情况为图像和媒体。这将允许您为每个作者添加无限制的图像和媒体字段,并且可以更快地进行搜索,例如此问题中的搜索。他们可以很容易地检索使用连接(如'$ C-> innerJoin( 'ImageClassName', 'ImageClassAlias');') – okyanet 2012-03-09 15:29:32

0

因此阐述提出的非常可贵之处jous,将多个数据点放在一个数据库列中会产生反效果 您想要的排序做一个sql查询(使用相同的构造jous显示,但没有字符串操作),将会很简单,快速,高效。
要修改此表,你会简单地将下面的列添加到您的表到位作者:

姓氏
中间名

要告诉你如何简单,这是(并使其更容易),这里的代码做到这一点:

ALTER TABLE [tablename] 
ADD COLUMN firstname varchar(32) 
ADD COLUMN lastname varchar(32) 
ADD COLUMN middlename varchar(32) 
DROP COLUMN author; 

然后镆铘PHP代码如下:

$c->sortby('lastname','ASC'); 

所以这相当容易完成......如果您仍然需要支持其他作者参考,则创建一个视图,以与未更改表格相同的方式返回作者(如下所示)(注意:您仍然必须更改表名引用,以便它指向的视图,而不是表...如果这将是再大的问题,重命名表,并命名视图一样的旧表是......):

CREATE VIEW oldtablename AS 
SELECT firstname+' '+middlename+' '+lastname' ' AS author 
FROM newtablename; 

注意:如果您确实创建了上述视图,则可能需要添加新表格中的所有其他列(多个图像&媒体列)。 注2:然而,我会补充说,那些理想情况下将在单独的表格中加入一个连接表格,但如果我处于您的位置,我可能会同意,便利可能会超出实用性&未来的可用性....但是如果你没有把他们在不同的表,你不能向这些表添加到这个视图(如加入到新表),并且仍然能够支持现有的代码依赖于旧表&它的结构。

虽然上述都是很容易完成,将与你轻微的调整,这是在使用自定义表更改的最后部分由xPDO反映工作。如果你已经对此感到满意,并知道该怎么做,那么很好。 如果你不是,这是迄今为止对这一主题的最好的文章:http://bobsguides.com/custom-db-tables.html

(是的,这是值得让Bob的代码,那么所有这一切都可以简单地为您生成一个片断,一旦数据库已经作了修改......(记得你可能需要删除现有的架构文件& xpdo相关的类文件&地图文件之前运行鲍勃的生成代码,或更改具有相同的表名的观点一样,将不会生效) 。

希望这有助于你(或旁边的人问类似的问题)