Sql 限制在多个表上连接的内容
我想使用SQLite计算多对多关系(tag-tags-post)上的表行子集。我尝试了以下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')
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
中没有与我的条件匹配的行。然而,根据我的编辑,事实上有符合条件的行,并且在此之前发布了带有标记的帖子