【发布时间】:2015-01-12 01:56:33
【问题描述】:
我有包含文章和用户的表格,两者都有到第三个表格的多对多映射 - 读取。
我在这里要做的是获取特定用户的所有未读文章(user_id 不存在于表 reads 中)。
我的查询正在获取所有文章,但已标记阅读的文章,如果可以,我可以将它们过滤掉(user_id 字段包含相关用户的 id)。
我有一个这样的 SQL 查询:
SELECT articles.id, reads.user_id
FROM articles
LEFT JOIN
reads
ON articles.id = reads.article_id AND reads.user_id = 9
ORDER BY articles.last_update DESC LIMIT 5;
产生以下结果:
articles.id | reads.user_id
-------------------+-----------------
57125839 | 9
57065456 |
56945065 |
56945066 |
56763090 |
(5 rows)
这很好。这就是我想要的。
我想使用我的文章模型在 Catalyst 中获得相同的结果,但我找不到任何选项来向 JOIN 子句添加条件。
您知道如何将AND X = Y 添加到 DBIx JOIN 中吗?
我知道这可以通过自定义结果源和虚拟视图来完成,但我还有其他一些可以从中受益的查询,我想避免为每个查询创建虚拟视图。
谢谢, 粤语
【问题讨论】:
-
您是否尝试将其添加为“标准”where 子句?
-
是的。 “标准” where 子句将仅过滤用户阅读的那些文章(存在于 reads 表中)。它不会显示相应读取表条目为 NULL 的文章。使用 AND 和 LEFT JOIN 会给我所有的文章。如果文章被读取,则设置 user_id 字段,否则为 NULL。
-
如果要获取带有
reads.user_id = NULL的文章,则不能在查询中使用AND reads.user_id = 9条件。 -
@kordirko 当然可以。只要它在 JOIN 子句中。
SELECT articles.id, reads.user_id FROM articles LEFT JOIN reads ON reads.article_id = articles.id AND reads.user_id = 9 ORDER BY articles.last_update DESC LIMIT 5;身份证 | user_id ----------+--------- 57125839 | 9 57065456 | 56945065 | 56945066 | 56763090 |抱歉,我无法格式化此评论... -
@kordirko 不幸的是,这不起作用,因为它会过滤掉其他用户(除了 id 9)阅读的文章。我原来的问题中的查询正在做我想做的事。我只想使用 DBIx/Catalyst 模型做同样的事情。
标签: perl postgresql catalyst dbix-class