に多くのポストからタグを除外:は、私は3つのテーブル持っているPostgresの使用多くのクエリ
CREATE TABLE post (id SERIAL, body TEXT);
CREATE TABLE tag (id SERIAL, name TEXT);
CREATE TABLE post_tag (post_id INT, tag_id INT);
INSERT INTO post(body) values('post 1');
INSERT INTO post(body) values('post 2');
INSERT INTO tag(name) values('a');
INSERT INTO tag(name) values('b');
INSERT INTO post_tag values(1, 1);
INSERT INTO post_tag values(1, 2);
INSERT INTO post_tag values(2, 1);
をこのようにpost 1
はa, b
とpost 2
がタグとしてa
を持つタグを持っています。
質問:タグb
を持たないすべての投稿を選択するには、post 2
のみを選択する必要があります。
それはpost 1
は2個のタグa
& b
を持っていることを考えると、両方の記事が選択されますので、ここでは、このクエリは良くありません。
SELECT post.*
FROM post
JOIN post_tag ON post_tag.post_id = post.id
JOIN tag ON tag.id = post_tag.tag_id
WHERE tag.name != 'b';
作品以下このクエリを、しかし、タグaaaaaaab
は、それが、その後がある場合ので、間違っていますそれにも一致します:
SELECT post.id, post.body, string_agg(tag1.name, ', ')
FROM post
JOIN post_tag ON post_tag.post_id = post.id
JOIN tag ON tag.id = post_tag.tag_id
GROUP BY post.id, post.body
HAVING string_agg(tag.name, ', ') not like '%b, %';
私はこれに対して「正しい」効率的なアプローチを探しています。
編集:クエリは、タグを一切持たない投稿と一致する必要があります。
ありがとうございます!タグがない投稿はどうですか?論理的には、結果にも含める必要があります。申し訳ありませんが、私は以前これについて考えていませんでした。 –
編集された回答を参照してください。 – klin