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

只是不清楚,通过删除AND条件,我得到了结果,尽管所有行都符合post预期。此外,以下查询

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

提供正确的结果。

编辑 2

标签表中存在数据输入错误。查询现在工作正常。向大家道歉。投票删除。

4

3 回答 3

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

如果 tag 在 group by 中包含除四列之外的任何列,则原始 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 在表之间不匹配。

于 2012-08-08T13:15:21.413 回答
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 
于 2012-08-08T13:16:38.243 回答
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 ;

也可以尝试将时间缩短为毫秒: '2012-08-08 12:42:41.696'或秒: '2012-08-08 12:42:41'

于 2012-08-08T14:23:54.577 回答