2012-08-08 80 views
0

我想使用SQLite来计算多对多关系(tag-tags-post)中表的一行的子集。我曾尝试下面的SQL没有运气:限制多个表加入的内容

SELECT tag.*, count(post.id) 
FROM tag 
JOIN tags 
    ON tag.id = tags.tag_id 
JOIN post 
    ON post.id = tags.post_id 
    AND datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

我曾尝试移动条件为WHERE条款但这改变不了什么。没有条件,结果如预期显示。

编辑1

就OT是明确的,通过移除AND条件我得到的结果,尽管与post所有行,符合市场预期。此外,以下查询

SELECT count(post.id) 
FROM post 
WHERE datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 

提供正确的结果。

EDIT 2

有没有在标签表中的数据录入错误。该查询现在工作正常。向所有人道歉。投票删除。

+0

你不能做WHERE GROUP BY。我认为这是一个错字? – podiluska 2012-08-08 13:00:55

+0

确实,我已经删除了那个。谢谢。 – NobRuked 2012-08-08 13:05:08

+0

@ypercube没有返回结果。 – NobRuked 2012-08-08 14:22:28

回答

2

你有没有尝试过这样的:

SELECT tag.id, tag.name, tag.description, tag.slug, count(post.id) 
FROM tag JOIN 
    tags 
    ON tag.id = tags.tag_id JOIN 
    post 
    ON post.id = tags.post_id AND 
     datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

如果标签有比组由四个以外的任何列中的原始SQL会产生一个错误。尽管如此,为了得到你想要的,你需要:COUNT(DISTINCT post.id)。

检查原来加入做右外正在连接,而不是连接:

SELECT tag.id, tag.name, tag.description, tag.slug, count(post.id) 
FROM tag right outer JOIN 
    tags 
    ON tag.id = tags.tag_id right outer JOIN 
    post 
    ON post.id = tags.post_id AND 
     datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

如果你得到一个列,其中前四列是NULL,那么你的ID不表之间的匹配。

+0

不幸的是,这没有提供任何结果。 – NobRuked 2012-08-08 13:57:13

+0

此查询使用原始查询中设置的连接。据推测,从标签到标签或从标签到发布都存在问题。您可以尝试外连接以查看这是否是问题。 – 2012-08-08 14:17:35

+0

Gordon使用'LEFT OUTER JOIN'提供了一个结果,虽然不正确(每个标记为0行),表明'post'中没有行符合我的条件。但是,按照我的编辑,实际上有符合条件的行。 – NobRuked 2012-08-08 14:24:25

2

你的日期精度太高了吗?

即:做这项工作

SELECT tag.*, count(post.id) 
FROM tag 
JOIN tags 
    ON tag.id = tags.tag_id 
JOIN post 
    ON post.id = tags.post_id 
    AND datetime(post.published) < datetime('2012-08-08 12:42:41') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 
+0

不,空白结果。 – NobRuked 2012-08-08 13:57:32

+0

你有那些在这段时间之前发布过标签的帖子...? – podiluska 2012-08-08 13:58:44

+0

是的。所选列“post.published”仅仅是一个例子。试图过滤'post'的行似乎每次都不会导致行。 – NobRuked 2012-08-08 14:04:13

1

也许有一些问题与铸件。我不确定是否需要剧组DATETIME

与内试试这个联接左联接替换,这至少会显示0计数的所有标签,如果没有后符合条件:

SELECT tag.*, COUNT(DISTINCT post.id) 
FROM tag 
    LEFT JOIN tags 
    ON tag.id = tags.tag_id 
    LEFT JOIN post 
    ON post.id = tags.post_id 
    AND post.published < '2012-08-08 12:42:41.696451' 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name ; 

也尝试用切碎的时间millseconds:'2012-08-08 12:42:41.696'或秒:'2012-08-08 12:42:41'

+0

事实上,这显示了所有标记为0的结果。但是,有__are__行符合条件,根据我对该问题的编辑。 – NobRuked 2012-08-08 14:25:08

+0

@nobRuked:看我的编辑。无论如何,你可以在3张桌子上发布几行(与节目相匹配)吗? – 2012-08-08 14:27:33