2012-03-06 4 views
1

У меня есть таблица MySQL, который выглядит следующим образом:PHP сортировать массив по Lastname разделенных пробелами в MODx

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

поле «автор» имеет нормально Firstname (Secondname) Lastname разделенным пробелами. Как я могу отсортировать массив после имени Lastname и если после него будет только одно имя.

Это запрос 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

+0

Другое примечание для всех, кто это читает: MODx позволяет вам очень легко нормализовать ваши данные в отдельные таблицы, в вашем случае для изображений и носителей. Это позволит вам добавлять неограниченное количество изображений и медиа-полей для каждого автора и ускорить поиск, например, в этом вопросе. Их можно легко получить с помощью объединений (например, '$ c-> innerJoin ('ImageClassName', 'ImageClassAlias');') – okyanet

0

Так подробно остановиться на очень ценную точку jous сделал, Сортировка, которую вы хотите использовать, чтобы сделать несколько точек данных в одном столбце базы данных. do было бы простым, быстрым, & эффективным, в sql-запросе (используя ту же конструкцию jous, но без операции с строкой).
Чтобы изменить эту таблицу, просто добавьте следующие столбцы в таблице вместо автора:
ПгвЬЫате
Lastname
MiddleName

Чтобы показать вам, как просто это (и делает его еще проще) вот код, чтобы сделать это:

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

(Да, это стоит получить код Боба как фрагмент кода, так что все это может быть просто создан для вас, как только изменения базы данных были сделаны ... (помните, что вам, скорее всего, нужно будет удалить существующий файл схемы & связанных с xpdo файлов классов & файлов карт, прежде чем запускать код генерации Боба, или ваши изменения с тем же именем таблицы, что и представление, не вступят в силу) .

Надеется, что это помогает (или следующему человеку, чтобы задать подобный вопрос)

Смежные вопросы