MySQL查询模式匹配

时间:2013-09-19 14:13:00

标签: mysql .net

首先,这是我正在研究的表格的简化版本:

╔═══════╦═══════════╦══════════╦═══════════╗
║  ID   ║ FIRSTNAME ║ LASTNAME ║ COMPANYID ║
╠═══════╬═══════════╬══════════╬═══════════╣
║ 12345 ║ Bob       ║ Smith    ║         3 ║
║ 13826 ║ Bob       ║ Smith.Mr ║         3 ║
║ 16326 ║ Bob       ║ Smith Mr ║         3 ║
║ 16382 ║ Dr.Bob    ║ Smith    ║         3 ║
║ 18372 ║ Kim       ║ Johnson  ║         3 ║
╚═══════╩═══════════╩══════════╩═══════════╝

鉴于只有id 12345,我应该能够根据我从12345和他的公司ID获得的所有记录获得所有记录,所以基本上所有记录都来自公司3的Bob Smith。

我不确定如何处理这个查询,我需要一种方法来从他的名字和名字中删除任何标题,空格或点。我假设我将使用姓氏连接名字并运行一个函数来删除我所拥有的内容:

Mr,Dr,Jr,Sr等...

结束了bobsmith。我需要对与id 12345关联的名称以及WHERE子句中的名称执行此操作,对吧?这将是比较名称。

我正在努力使这个查询尽可能快速有效,我应该使用子SELECT吗?我应该创建一个FUNCTION吗?不确定如何在.net中执行此操作。

非常感谢任何想法。

编辑:应该提到客户端也可能向我发送ID 13826,这是给Bob Smith.Mr而我仍然需要得到Bob Smith ID 12345,所以我想我会肯定要剥夺标题等......

3 个答案:

答案 0 :(得分:2)

SELECT  b.*
FROM    tableName a
        INNER JOIN tableName b
            ON a.companyID = b.companyID
WHERE   a.id = 12345 AND
        b.firstName LIKE CONCAT('%', a.firstName, '%') AND
        b.lastName LIKE CONCAT('%', a.lastName, '%')

输出

╔═══════╦═══════════╦══════════╦═══════════╗
║  ID   ║ FIRSTNAME ║ LASTNAME ║ COMPANYID ║
╠═══════╬═══════════╬══════════╬═══════════╣
║ 12345 ║ Bob       ║ Smith    ║         3 ║
║ 13826 ║ Bob       ║ Smith.Mr ║         3 ║
║ 16382 ║ Dr.Bob    ║ Smith    ║         3 ║
╚═══════╩═══════════╩══════════╩═══════════╝

答案 1 :(得分:0)

试试这个:

SELECT
    id,
    firstname,
    lastname,
    companyID
FROM
    my_table
WHERE
    companyID = (SELECT companyID FROM my_table WHERE id = 12345)
    AND firstname LIKE CONCAT('%',(SELECT firstname FROM my_table WHERE id = 12345),'%')
    AND lastname LIKE CONCAT('%',(SELECT lastname FROM my_table WHERE id = 12345),'%')

或者最快的方式:

 SELECT
        id,
        firstname,
        lastname,
        companyID
    FROM
        my_table
    WHERE
        companyID = @companyID
        AND firstname LIKE '%@firstname%'
        AND lastname LIKE '%@lastname%'

其中@ companyID,@ firstname,@ lastname是此查询的值:

SELECT companyID,firstname,lastname FROM my_table WHERE id = 12345

答案 2 :(得分:0)

您需要规范化您的数据。

首先,申请

  

lower(name)

将全部转换为小写

第二个正常步骤是移除MR。和东西。您使用REPLACE(name, "mr.", "")

执行此操作

如果你有其他垃圾请不要忘记substring_index存在 substring_index(name, 'Mr.', -1)会将字符串的一部分返回到先生

的右侧

在完成之后,只需按照其他人所说的去做,减去正则表达式

    select * 
from table as t1 
inner join table as t2 
on t1.firstname=t2.firstname 
and t1.lastname=t2.lastname 
and t1.companz=t2.companz 
where t2.user_id=12345

让你开始,你正在寻找

create table step1
select id, lower(name) as name,... from user;
create table step2
select id, replace(name, "mr.", "")... from step1;