限制多个表的连接

时间:2012-08-08 12:58:17

标签: sql sqlite

我想使用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

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

3 个答案:

答案 0 :(得分: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

如果标记包含除了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在表之间不匹配。

答案 1 :(得分: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 

答案 2 :(得分: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'