首页 > 解决方案 > 在连接两个表时需要帮助,但连接表中没有完全相同的信息

问题描述

我有两张桌子:articleslog

文章表有这些列

例子

title                                    | slug
-----------------------------------------|----------------------------
cats are cute and wonderfully adorable   | cats-are-cute

log表有列:

path                          |  id 
------------------------------|--------
/article/cats-are-cute        |  123

我需要一个查询来查找有史以来最受欢迎的三篇文章是什么

我试过这个

select articles.title, count(log.id) as views
from articles
    right join log on log.path like concat('/article/',articles.slug)
group by articles.title
order by views desc limit 3;

它没有显示正确的值。

以下两个答案都是正确的,但我选择的答案需要更少的处理时间

标签: sqlpostgresql

解决方案


听起来您想检查表的slugarticles是否包含在表path的列log中。我们可以尝试在 Postgres 中使用 POSIX 正则表达式来处理:

SELECT
    a.title,
    COUNT(l.id) AS views
FROM articles a
LEFT JOIN log l
    ON l.path ~ CONCAT('.*\y', a.slug, '\y.*')
GROUP BY
    a.title
ORDER BY
    views DESC
LIMIT 3;

这将匹配包含作为精确路径组件的来自相应文章的 slug 的任何路径。


推荐阅读