0

在我的 mysql 表中,我有一个字段是 4 个字母的 Myers-Briggs 个性类型。当性格类型与查询中的性格类型匹配时,我想通过表格进行搜索并匹配,因为它有两个共同点。我理解这一点的方式,实际上只是找到两者中最长的公共子序列并测试它是否 >= 2

例子:

'ISTJ' 会匹配 'INFJ',因为公共子序列的长度是 'IJ' >= 2

'ISTJ' 不会与 'INFP' 匹配,因为公共子序列的长度是 'I' <= 2

有没有办法在 mysql 查询中做到这一点?我正在使用 CakePHP 进行查询,所以如果您知道如何使用 Cake 进行此操作,那也会很有帮助。

4

2 回答 2

2

Myer-Briggs 人格类型是位置性的。这意味着您可以逐个字符进行比较。

这是一种方法,您只需输入一次比较字符串:

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 的话,四个分类轴中的每一个都有两种可能性,并且字母的顺序是恒定的(因此没有任何意义)。

在这种情况下,您可以使用如下所示的四个二态列,而不是一个字符串:

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 回答