sql - 在连接两个表时需要帮助,但连接表中没有完全相同的信息
问题描述
我有两张桌子:articles
和log
文章表有这些列
title
代表文章的全名slug
表示名称的较短版本
例子
title | slug
-----------------------------------------|----------------------------
cats are cute and wonderfully adorable | cats-are-cute
log
表有列:
path | id
------------------------------|--------
/article/cats-are-cute | 123
path
代表蛞蝓,但开头是'/article/'
并且还有一些空值id
表示已阅读该文章的用户 id
我需要一个查询来查找有史以来最受欢迎的三篇文章是什么
我试过这个
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;
它没有显示正确的值。
以下两个答案都是正确的,但我选择的答案需要更少的处理时间
解决方案
听起来您想检查表的slug
列articles
是否包含在表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 的任何路径。
推荐阅读
- entity-framework - Redis 作为实体框架的二级缓存
- systemd - Systemd - 无法设置以太网接口的速度/双工
- sql - 创建一个 SQL 函数以在检查数据时返回一个位
- swift - SwiftUI:内容有填充
- python - CityEngine PyDev 控制台“控制台已经以值退出:0 等待回答。”
- c# - 面临阿联酋货币代码价格在c#中翻倍的问题
- c# - 来自 C# 应用程序的 UWF 统一写入过滤器访问
- python - 在 Python cx_Oracle 中从 Oracle DB 获取序列号
- javascript - 如何获取 cookie 并为每个循环执行
- wso2 - WSO2 EI 缓存调解器,如何验证控制标头