Cela prend smhg d'ici et curt's from Last index d'une sous-chaîne donnée dans MySQL et les combine. Ceci est pour mysql, tout ce dont j'avais besoin était d'obtenir une répartition décente du nom en prénom nom_nom avec le nom de famille un seul mot, le prénom tout avant ce mot unique, où le nom pourrait être nul, 1 mot, 2 mots ou plus de 2 mots. Ie: Null; Marie; Mary Smith; Mary A. Smith; Mary Sue Ellen Smith;
Donc, si nom est un mot ou nul, last_name est nul. Si nom est> 1 mot, last_name est le dernier mot et first_name tous les mots avant le dernier mot.
Notez que j'ai déjà coupé des trucs comme Joe Smith Jr.; Joe Smith Esq. et ainsi de suite, manuellement, ce qui était douloureux, bien sûr, mais c'était assez petit pour le faire, vous voulez donc vous assurer de bien regarder les données dans le champ de nom avant de décider de la méthode à utiliser.
Notez que cela réduit également le résultat, de sorte que vous ne vous retrouvez pas avec des espaces devant ou après les noms.
Je publie juste ceci pour d'autres qui pourraient chercher ce dont j'avais besoin sur Google. Cela fonctionne, bien sûr, testez-le d'abord avec le select.
C'est une chose ponctuelle, donc je me fiche de l'efficacité.
SELECT TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
) AS first_name,
TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
) AS last_name
FROM `users`;
UPDATE `users` SET
`first_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
),
`last_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
);