我使用带有ON子句的LEFT JOIN执行查询,但它似乎没有正常运行。
相关架构:
的CDR
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,'%')
答案 0 :(得分:1)
SELECT
c.id,
r.id
LENGTH(r.apartypattern) as `r_l`,
LENGTH(r.bpartypattern) as `r_b`
FROM cdrs c
LEFT JOIN rates r ON c.aparty LIKE CONCAT(r.apartypattern,'%') AND
c.bparty LIKE CONCAT(r.bpartypattern,'%')
ORDER BY `r_l` DESC, `r_b` DESC