我想使用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
标签表中存在数据输入错误。查询现在正常工作。向大家道歉。投票删除。
答案 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'