PHP按照由modx中的空格分隔的姓氏对数组进行排序

时间:2012-03-06 11:36:20

标签: php sorting modx

我有一个看起来像这样的mysql表:

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

The Field"作者" normaly的名字(名字)姓氏由空格分隔。 如何在Lastname之后对数组进行排序,如果在此之后只存在一个名称。

这是我用来对作者进行排序的modx查询,但显然它没有使用姓氏。

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

2 个答案:

答案 0 :(得分:2)

你现在正在为自己的脚射击,原因有两个:

  • 当字符串中只有一个单词时,排序很难预测。
  • 您有数据索引是有原因的。他们使a lot更快。使用字符串函数强制进行表扫描。足够100个数据单位,10000行慢,'数据库去度假'1000000。
  • 下次您必须使用作者字段并且您意识到必须将其拆分为单词时,您还必须了解并修复旧代码之上的此代码段。

那说 - 我没有测试过 - 但试试这个:

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

答案 1 :(得分: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;

然后modx 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相关运行Bob的生成代码之前的类文件和映射文件,或者具有相同表名的更改(如视图)将不会生效。

希望这有助于你(或下一个人提出类似的问题)。