0

私のmysqlテーブルには、4文字のMyers-Briggsパーソナリティタイプのフィールドがあります。テーブルを検索して、2 つの側面を共有することで、パーソナリティ タイプがクエリのパーソナリティ タイプと一致する場合に一致させたいと考えています。私がこれを理解する方法は、実際には、2 つの最も長い共通部分列を見つけて、それが >= 2 であることをテストすることです。

例:

'ISTJ' は 'INFJ' と一致します。これは、共通部分配列の長さが 'IJ' >= 2 であるためです。

'ISTJ' は 'INFP' と一致しません。これは、共通部分配列の長さが 'I' <= 2 であるためです。

mysqlクエリでこれを行う方法はありますか? 私はクエリに CakePHP を使用しているので、Cake でこれを行う方法を知っていれば、それも役に立ちます。

4

2 に答える 2

2

マイヤー・ブリッグスの性格タイプは位置的です。これは、文字ごとに比較できることを意味します。

比較文字列を 1 回入力するだけでよい方法の 1 つを次に示します。

select t.*
from (select t.*,
             (case when substring(t.MyerBriggs, 1, 1) = substring(const.comp, 1, 1)
                   then 1 else 0
              end) as MB1,
             (case when substring(t.MyerBriggs, 2, 1) = substring(const.comp, 2, 1)
                   then 1 else 0
              end) as MB2,
             (case when substring(t.MyerBriggs, 3, 1) = substring(const.comp, 3, 1)
                   then 1 else 0
              end) as MB3,
             (case when substring(t.MyerBriggs, 4, 1) = substring(const.comp, 4, 1)
                   then 1 else 0
              end) as MB4
      from t cross join
           (select 'INFJ' as comp) const
     )
where (MB1+MB2+MB3+MB4) >= 2

実際には、MySQL でこれを次のように単純化できます。

      select t.*
      from t cross join
           (select 'INFJ' as comp) const
      where (if(substring(t.MyerBriggs, 1, 1) = substring(const.comp, 1, 1), 1, 0) +
             if(substring(t.MyerBriggs, 2, 1) = substring(const.comp, 2, 1), 1, 0) +
             if(substring(t.MyerBriggs, 3, 1) = substring(const.comp, 3, 1), 1, 0) +
             if(substring(t.MyerBriggs, 4, 1) = substring(const.comp, 4, 1), 1, 0)
            ) >= 2
于 2012-12-27T16:07:09.523 に答える
0

Myers-Briggs のことを正しく理解していれば、4 つの分類軸のそれぞれに 2 つの可能性があり、文字の順序は一定です (したがって意味はありません)。

この場合、1 つの文字列の代わりに、以下のように 4 つの 2 状態の列を使用できます。

CREATE TABLE profile (
    user_id INT,
    EI ENUM ('E', 'I'),
    SN ENUM ('S', 'N'),
    TF ENUM ('T', 'F'),
    JP ENUM ('J', 'P')
);

プロファイル「ISTJ」は次のように挿入されます。

INSERT INTO profile VALUE (1, 'I', 'S', 'T', 'J');

プロファイル「INFJ」とのマッチングは次のようになります。

SELECT * FROM profile WHERE
   (EI = 'I') + (SN = 'N') + (TF = 'F') + (JP = 'J') >= 2
于 2012-12-27T16:05:07.340 に答える