2012-03-06 79 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相關的類文件&地圖文件之前運行鮑勃的生成代碼,或更改具有相同的表名的觀點一樣,將不會生效) 。

希望這有助於你(或旁邊的人問類似的問題)