为什么我的LEFT JOIN没有返回预期的结果集?

时间:2014-05-05 12:29:56

标签: mysql join left-join

我使用带有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,'%')

1 个答案:

答案 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
相关问题