【发布时间】:2014-05-05 12:29:55
【问题描述】:
我正在使用带有 ON 子句的 LEFT JOIN 执行查询,但它似乎没有正确运行。
相关架构:
cdrs
id [primary key - auto incrementing]
aparty [VARCHAR(50)]
bparty [VARCHAR(50)]
费率
id [primary key - auto incrementing]
apartypattern [VARCHAR(50)]
bpartypattern [VARCHAR(50)]
可能有多个模式匹配一个 cdr。如果从左到右阅读,模式的所有字符从相关 cdr 字段的开头按顺序出现,则认为模式匹配。 当存在多个匹配时,描述匹配条件的逻辑可以表示为:
ORDER BY LENGTH(bpartypattern), LENGTH(apartypattern) LIMIT 1
我正在尝试通过以下查询来实现这一点:
SELECT c.id, r_a.id
FROM cdrs c
LEFT JOIN (
SELECT id, LENGTH(apartypattern) AS maxlen, apartypattern
FROM rates
) r_a ON c.aparty LIKE CONCAT(r_a.apartypattern,'%')
LEFT JOIN (
SELECT id, LENGTH(bpartypattern) AS maxlen, bpartypattern
FROM rates
) r_b ON c.bparty LIKE CONCAT(r_b.bpartypattern,'%')
WHERE r_a.id = r_b.id
GROUP BY c.id
ORDER BY r_b.maxlen DESC, r_a.maxlen DESC
但是我得到的结果与我将 WHERE 子句替换为:
WHERE r_a.id = 1 AND r_b.id = 1
在手动检查数据集后,有明显应该匹配但没有匹配的行。
作为进一步的故障排除步骤,我尝试按如下方式简化查询,但仍会得到结果,就像应用了替代 WHERE 子句一样:
SELECT c.id, r_a.id
FROM cdrs c
LEFT JOIN (
SELECT id, LENGTH(aparty) AS len, apartypattern
FROM rates
) r ON c.aparty LIKE CONCAT(r_a.apartypattern,'%')
【问题讨论】:
-
我怀疑你可以使用
LIKE关键字加入。我宁愿选择长度等于maxlen的c.bparty的子字符串并比较两者。 -
请考虑提供一些示例数据...特别是模式。
-
您在 WHERE 子句中使用
r_a.id和r_b.id。所以两者都不能为 NULL 这对我来说意味着你没有 LEFT JOIN 而是 INNER JOIN。