如何在MySQL中对IN语句进行部分匹配

如何在MySQL中对IN语句进行部分匹配,mysql,Mysql,我将多个表连接到一个查询中。我需要对in语句中的值进行部分匹配。这里有一个例子 SELECT DISTINCT am.id AS id, am.flagged AS flagged, am.name AS name, am.type AS type, am.file AS file, am.s3_tag AS s3_tag, am.low_s3_tag AS low_s3_tag FROM accounts_media am

我将多个表连接到一个查询中。我需要对in语句中的值进行部分匹配。这里有一个例子

SELECT DISTINCT 
    am.id AS id, 
    am.flagged AS flagged, 
    am.name AS name, 
    am.type AS type, 
    am.file AS file, 
    am.s3_tag AS s3_tag, 
    am.low_s3_tag AS low_s3_tag 
FROM accounts_media am 
    LEFT JOIN accounts_location_media alm ON am.id = alm.media_id 
    LEFT JOIN accounts_location al ON al.id = alm.location_id 
    LEFT JOIN accounts_person_media apm ON am.id = apm.media_id 
    LEFT JOIN accounts_person ap ON ap.id = apm.person_id 
    LEFT JOIN accounts_event_media_record aemr ON am.id=aemr.media_id 
    LEFT JOIN accounts_medianote_media_record amma ON am.id=amma.media_id 
    LEFT JOIN accounts_medianote amn ON amma.medianote_id=amn.id 
WHERE 
    am.account_id = '1234' 
    AND am.flagged = FALSE 
    AND ('Da' IN (SELECT first_name FROM accounts_person WHERE account_id = '1234') 
    AND ('Rob' IN (SELECT first_name FROM accounts_person WHERE account_id = '1234') 

和“Da”中的“从帐户中选择第一个\u姓名,其中帐户\u id='1234'

语句表中有表示“Dan”、“Daniel”等的值。还有“Rob”和“Robert”。我需要那个语句来确保表中包含“Da”的名称和任何包含“Rob”的名称。有办法做到这一点吗

因此,一条记录可以链接到accounts\u person表中的多个人。假设我有三张唱片

记录一:一个叫丹的人附在记录上

记录二:一个名叫罗伯特的人附在记录上

记录三:一个叫丹的人和一个叫罗伯特的人附在记录上


我希望查询只返回记录3,因为它有“Da”和“Rob”的匹配项。

我不确定,但我想您需要一个like语句,在Da之后有一个通配符

SELECT DISTINCT 
    am.id AS id, 
    am.flagged AS flagged, 
    am.name AS name, 
    am.type AS type, 
    am.file AS file, 
    am.s3_tag AS s3_tag, 
    am.low_s3_tag AS low_s3_tag 
FROM accounts_media am 
    LEFT JOIN accounts_location_media alm ON am.id = alm.media_id 
    LEFT JOIN accounts_location al ON al.id = alm.location_id 
    LEFT JOIN accounts_person_media apm ON am.id = apm.media_id 
    LEFT JOIN accounts_person ap ON ap.id = apm.person_id 
    LEFT JOIN accounts_event_media_record aemr ON am.id=aemr.media_id 
    LEFT JOIN accounts_medianote_media_record amma ON am.id=amma.media_id 
    LEFT JOIN accounts_medianote amn ON amma.medianote_id=amn.id 
WHERE 
    am.account_id = '1234' 
    AND am.flagged = FALSE 
    AND (accounts_person.first_name like '%Da%'
    OR accounts_person.first_name like '%Rob%') 
    AND accounts_person.account_id = '1234'

我不确定,但我想你需要一个类似的声明,在Da之后有一张通配符

SELECT DISTINCT 
    am.id AS id, 
    am.flagged AS flagged, 
    am.name AS name, 
    am.type AS type, 
    am.file AS file, 
    am.s3_tag AS s3_tag, 
    am.low_s3_tag AS low_s3_tag 
FROM accounts_media am 
    LEFT JOIN accounts_location_media alm ON am.id = alm.media_id 
    LEFT JOIN accounts_location al ON al.id = alm.location_id 
    LEFT JOIN accounts_person_media apm ON am.id = apm.media_id 
    LEFT JOIN accounts_person ap ON ap.id = apm.person_id 
    LEFT JOIN accounts_event_media_record aemr ON am.id=aemr.media_id 
    LEFT JOIN accounts_medianote_media_record amma ON am.id=amma.media_id 
    LEFT JOIN accounts_medianote amn ON amma.medianote_id=amn.id 
WHERE 
    am.account_id = '1234' 
    AND am.flagged = FALSE 
    AND (accounts_person.first_name like '%Da%'
    OR accounts_person.first_name like '%Rob%') 
    AND accounts_person.account_id = '1234'
试试这个:

WHERE 
    am.account_id = '1234' 
    AND am.flagged = FALSE 
    -- AND ( ap.first_name LIKE '%Da%' OR ap.first_name LIKE '%Rob%')
    AND EXISTS 
        ( SELECT 1
            FROM accounts_person apx
           WHERE apx.first_name LIKE '%Da%'
             AND apx.account_id = am.account_id
        )
    AND EXISTS 
        ( SELECT 1
            FROM accounts_person apy
           WHERE apy.first_name LIKE '%Rob%'
             AND apy.account_id = am.account_id
        )
试试这个:

WHERE 
    am.account_id = '1234' 
    AND am.flagged = FALSE 
    -- AND ( ap.first_name LIKE '%Da%' OR ap.first_name LIKE '%Rob%')
    AND EXISTS 
        ( SELECT 1
            FROM accounts_person apx
           WHERE apx.first_name LIKE '%Da%'
             AND apx.account_id = am.account_id
        )
    AND EXISTS 
        ( SELECT 1
            FROM accounts_person apy
           WHERE apy.first_name LIKE '%Rob%'
             AND apy.account_id = am.account_id
        )


唯一的问题是,如果我需要确保accounts\u person表中有两个或多个名字。我编辑了上面的问题以反映这一点。您的更新仍然不起作用,因为accounts\u person.first\u name永远不会像“%Da%”和“%Rob%”,因为一条记录一次只能有一条。因此,这和那里总是会失败。这就是为什么我需要用嵌套的SELECT语句执行IN语句。这有意义吗?或那里也不起作用。因为它会给我的结果可能只包含“Da”或“Rob”,而不是同时包含“Da”或“Rob”的记录。提供一些您希望返回的数据可能会有所帮助。我在底部用一个示例更新了原始问题。这有帮助吗?唯一的问题是如果我需要确保accounts\u person表中有两个或多个名字。我编辑了上面的问题以反映这一点。您的更新仍然不起作用,因为accounts\u person.first\u name永远不会像“%Da%”和“%Rob%”,因为一条记录一次只能有一条。因此,这和那里总是会失败。这就是为什么我需要用嵌套的SELECT语句执行IN语句。这有意义吗?或那里也不起作用。因为它会给我的结果可能只包含“Da”或“Rob”,而不是同时包含“Da”或“Rob”的记录。提供一些您希望返回的数据可能会有所帮助。我在底部用一个示例更新了原始问题。这有帮助吗?你是在寻找名字以Da和Rob开头的记录,还是任何以Da或Rob开头的记录?我需要有Da和Rob的记录。不一定以开始,但包含。似乎你应该使用连接。njk,你能举个例子说明我如何使用连接来完成此操作吗?你如何将Dan和Robert附加到记录中?这是否意味着有两个帐户\个人记录附加到一个帐户\ id?您是否正在查找名称以Da和Rob开头的记录,或任何以Da或Rob开头的记录?我需要包含Da和Rob的记录。不一定以开始,但包含。似乎你应该使用连接。njk,你能举个例子说明我如何使用连接来完成此操作吗?你如何将Dan和Robert附加到记录中?这是否意味着有两个帐户\u个人记录附加到一个帐户\u id?