我有以下表格:
Posts: id, CategoryId
PostAssociations: PostId FK Posts(id), AssociatedPostId FK Posts(id)
因此,每篇文章可能会有许多其他帖子作为相关帖子。
我需要的是:
对于尚未发布任何相关帖子的每个帖子P,请添加来自同一类别的4个随机关联帖子(不包括帖子P - 不应与自己关联)。
到目前为止我已经
了# SELECT Posts that don't have any associated posts yet
SELECT p.id
FROM "Posts" p
LEFT OUTER JOIN "PostAssociations" pa ON pa."PostId" = p.id
WHERE pa."PostId" IS NULL
和
# SELECT 4 random posts from given category and excluding given id
SELECT id
FROM "Posts" p2
WHERE p2."CategoryId" = ? AND p2.id != ?
ORDER BY RANDOM()
LIMIT 4
我需要这样的查询:
INSERT INTO "PostAssociations" VALUES ...
SQL解释我需要什么:http://sqlfiddle.com/#!2/6ba735/5
答案 0 :(得分:1)
当您使用postgresql-9.3标记帖子时,我想使用LATERAL
将随机ID生成查询应用于所有缺少关联的ID应该起作用。 (这应该在功能上类似于使用OUTER APPLY
和MS SQL)。
Sample SQL Fiddle(显示之前,插入和之后)。
INSERT INTO PostAssociations
SELECT
p.id, rand.id rand
FROM Posts p
LEFT OUTER JOIN PostAssociations pa ON pa.PostId = p.id
LEFT JOIN LATERAL
(
SELECT id
FROM Posts
WHERE CategoryId = p.categoryid AND id != p.id
ORDER BY RANDOM()
LIMIT 4) AS rand ON TRUE
WHERE pa.PostId IS NULL;
我不能声称自己是Postgresql的专家,所以很有可能可以改进查询。