【问题标题】:Why is my LEFT JOIN not returning the expected result set?为什么我的 LEFT JOIN 没有返回预期的结果集?
【发布时间】: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 关键字加入。我宁愿选择长度等于maxlenc.bparty 的子字符串并比较两者。
  • 请考虑提供一些示例数据...特别是模式。
  • 您在 WHERE 子句中使用 r_a.idr_b.id。所以两者都不能为 NULL 这对我来说意味着你没有 LEFT JOIN 而是 INNER JOIN。

标签: mysql join left-join


【解决方案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

【讨论】:

  • 我不知道为什么我的最后一个不工作,但这已经产生了我需要的结果。如此简单,当您这样看时...谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2020-05-10
  • 2019-04-16
  • 2023-03-17
相关资源
最近更新 更多