【问题标题】:joining tables with concat and '%' isn't working使用 concat 和 '%' 连接表不起作用
【发布时间】:2019-08-12 19:53:41
【问题描述】:

我正在使用两张桌子。一个是带有标题和 slug 的文章名称列表,另一个是日志。两个表中唯一的共同元素是文章表中的 slug 和日志表中的路径。所有路径都以 /article/(slug) 开头。问题是某些路径是/article/(slug)(另一个字符)。我可以使用下面的代码加入表格。但是第二次我尝试使用 % 我没有得到任何结果。

这行得通:

SELECT log.path, articles.slug, articles.title, count(log.path) as num 
FROM articles LEFT JOIN log 
ON CONCAT('/article/', articles.slug) LIKE log.path 
GROUP BY log.path, articles.slug, articles.title 
ORDER BY num DESC;

但这没有给我带来令人困惑的结果,因为它应该:

SELECT log.path, articles.slug, articles.title, count(log.path) as num 
FROM articles LEFT JOIN log 
ON CONCAT('%', articles.slug) LIKE log.path 
GROUP BY log.path, articles.slug, articles.title 
ORDER BY num DESC;

我真正需要做的是:

SELECT log.path, articles.slug, articles.title, count(log.path) as num 
FROM articles LEFT JOIN log 
ON CONCAT('%', articles.slug, '%') LIKE log.path 
GROUP BY log.path, articles.slug, articles.title 
ORDER BY num DESC;

我做错了什么?

在这一点上,我会找到一种方法来连接两个表,它给了我 3 列:articles.slug、log.path、num。问题是我不知道如何创建一个表,它告诉我每个路径的 slug,因为多个路径具有相同的 slug。如果我能做到这一点,我可以按 slug 对这个表进行分组并使用 SUM 将数字相加,这将解决我的问题。

【问题讨论】:

  • 试试:ON log.path LIKE CONCAT('%', articles.slug, '%')
  • SQL 运算符 LIKEnot 可交换的。即:x LIKE yy LIKE x 不同。更具体地说,“%”和“_”只是右侧的通配符。
  • 是的。我意识到。我正在做更多的研究,发现所有使用 % 和 LIKE 的示例在右侧都有 % 部分,所以我尝试翻转它并且它起作用了。谢谢。

标签: sql postgresql


【解决方案1】:

SQL 运算符 LIKE可交换的。即:x LIKE yy LIKE x 不同。更具体地说,“%”和“_”只是右侧的通配符。

将您的查询更改为

    SELECT log.path, articles.slug, articles.title, count(log.path) as num 
    FROM articles LEFT JOIN log 
    ON log.path LIKE CONCAT('/article/', articles.slug)
    GROUP BY log.path, articles.slug, articles.title 
    ORDER BY num DESC;
    SELECT log.path, articles.slug, articles.title, count(log.path) as num 
    FROM articles LEFT JOIN log 
    ON log.path LIKE CONCAT('%', articles.slug)
    GROUP BY log.path, articles.slug, articles.title 
    ORDER BY num DESC;
    SELECT log.path, articles.slug, articles.title, count(log.path) as num 
    FROM articles LEFT JOIN log 
    ON log.path LIKE CONCAT('%', articles.slug, '%')
    GROUP BY log.path, articles.slug, articles.title 
    ORDER BY num DESC;

请注意,第一个查询仅有效,因为不涉及通配符。在本例中,x LIKE yx = y 相同(可交换的,因此在本例中为 y LIKE x)。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多