Sql 限制在多个表上连接的内容

Sql 限制在多个表上连接的内容,sql,sqlite,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')

我想使用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
提供正确的结果

编辑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.id、tag.name、tag.description、tag.slug、count(post.id)
从标记联接
标签
ON tag.id=tags.tag\u id连接
邮递
ON post.id=tags.post_id和
datetime(post.published)
如果标记在GROUPBY中有除四列以外的任何列,则原始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
选择tag.id、tag.name、tag.description、tag.slug、count(post.id)
从标记右外连接
标签
ON tag.id=tags.tag\u id右外连接
邮递
ON post.id=tags.post_id和
datetime(post.published)
如果您得到前四列为空的行,则您的ID在表之间不匹配。

您是否尝试过以下方法:

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.id、tag.name、tag.description、tag.slug、count(post.id)
从标记联接
标签
ON tag.id=tags.tag\u id连接
邮递
ON post.id=tags.post_id和
datetime(post.published)
如果标记在GROUPBY中有除四列以外的任何列,则原始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
选择tag.id、tag.name、tag.description、tag.slug、count(post.id)
从标记右外连接
标签
ON tag.id=tags.tag\u id右外连接
邮递
ON post.id=tags.post_id和
datetime(post.published)

如果您得到的行的前四列为空,那么您的ID在表之间不匹配。

您的日期精度太高了吗

Ie:这行吗

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 
选择标记。*,计数(post.id)
从标签
连接标签
ON tag.id=tags.tag\u id
投递
ON post.id=tags.post\u id
和datetime(post.published)
您的日期是否过于精确

Ie:这行吗

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 
选择标记。*,计数(post.id)
从标签
连接标签
ON tag.id=tags.tag\u id
投递
ON post.id=tags.post\u id
和datetime(post.published)
也许铸造有问题。我不确定是否需要转换为
DATETIME

尝试将内部联接替换为左联接,如果没有post匹配条件,则至少会显示计数为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 ;
选择标记。*,计数(不同的post.id)
从标签
左连接标记
ON tag.id=tags.tag\u id
左接线柱
ON post.id=tags.post\u id
和post.published<'2012-08-08 12:42:41.696451'
按tag.id、tag.name、tag.description、tag.slug分组
按tag.name排序;

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

可能铸造有问题。我不确定是否需要转换为
DATETIME

尝试将内部联接替换为左联接,如果没有post匹配条件,则至少会显示计数为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 ;
选择标记。*,计数(不同的post.id)
从标签
左连接标记
ON tag.id=tags.tag\u id
左接线柱
ON post.id=tags.post\u id
和post.published<'2012-08-08 12:42:41.696451'
按tag.id、tag.name、tag.description、tag.slug分组
按tag.name排序;

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

您无法按分组方式执行操作。我想那是个打字错误?事实上,我已经删除了。谢谢。未返回任何结果@ypercube。您不能执行WHERE GROUP BY。我想那是个打字错误?事实上,我已经删除了。谢谢。没有返回任何结果@ypercube。很遗憾,这不会传递任何结果。此查询正在使用原始查询中设置的联接。大概,从标记到标记或从标记到帖子的连接存在问题。您可以尝试外部联接以查看这是否是一个问题。Gordon使用
LEFT outer JOIN
传递一个结果,尽管结果不正确(每个标记0行),这表明
post
中没有与我的条件匹配的行。但是,根据我的编辑,实际上有符合条件的行。遗憾的是,这不会提供任何结果。此查询正在使用原始查询中设置的联接。大概,从标记到标记或从标记到帖子的连接存在问题。您可以尝试外部联接以查看这是否是一个问题。Gordon使用
LEFT outer JOIN
传递一个结果,尽管结果不正确(每个标记0行),这表明
post
中没有与我的条件匹配的行。然而,根据我的编辑,事实上有符合条件的行,并且在此之前发布了带有标记的帖子