2

フィールドを持つ InnoDB テーブルがあります

firstname, lastname

名前を表示するときは、通常、ファーストネームだけで十分です。ユーザーの名前が同じ場合があります。だから私は名字と姓の最初の文字を取得する必要があります:

CONCAT(firstname, ' ', SUBSTRING(lastname, 1, 1), '.')

二重名の場合に姓の最初の文字のみを表示する (効率的な) 方法はありますか? 何かのようなもの

WHEN isDouble(Firstname) THEN 
      CONCAT(firstname, ' ', SUBSTRING(lastname, 1, 1), '.') 
      ELSE firstname

/*編集*/私が考えていた解決策について言及するのを忘れました:

値が 1 または 0 の列「double_firstname」を作成し、CASE ステートメントを使用して選択します。次に、ユーザーの作成と削除で double_firstname 列を更新します。

4

2 に答える 2

0

あなたはそれを行う能力だけでなく、優れたパフォーマンスも求めました。次のインデックスがある場合は、names(firstname, lastname)うまく機能するはずです。

select (case when exists (select 1
                          from names n2
                          where n2.firstname = n.firstname and n2.lastname <> n.lastname
                         )
             then concat(firstname, ' ', left(lastname, 1))
             else firstname
        end)
from names n
于 2013-05-26T22:21:39.010 に答える
0

もちろん、その名のエントリ数が 1 より大きいかどうかを mysql に問い合わせることができます。

select IF( (select count(*) as cnt from person where firstname = p.firstname) > 1 
          , concat(firstname, " ", substring(lastname, 1))
          , firstname)
from person 
where id = 4711
;

しかし、それはそれほど速くはありません。

より多くの人にとってより良いのは、彼女を「呼び出す」方法の安定したマークです。それは最初は「ファーストネーム ラストネーム」であり、次に cronjob によってファーストネームに還元されることで、より個人的になる可能性があります。また、「John Doe」は単に John と呼ぶこともできます。彼は早く入ったからです。「John DaSecond」は「John D.」と呼び、「JohnDaThird」は「John DaT.」と呼びます。

そのシナリオでは、JohnD はユニークではありません。

John Doe は「John D.」に名前が変更されたことを知らされていますか? あなたのシナリオで?

于 2013-05-26T20:58:00.797 に答える