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.*, 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 に答える
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 の 4 つ以外の列がある場合、元の 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

最初の 4 列が NULL である行を取得した場合、ID がテーブル間で一致していません。

于 2012-08-08T13:15:21.413 に答える
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 に答える