Postgres verwenden Ich habe 3 Tabellen:in viele zu viele Anfragen
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);
So hat post 1
Tags a, b
und post 2
hat a
als Tag.
die Frage: Wie alle Beiträge wählen, die das Tag nicht b
haben, was bedeutet, es nur die post 2
wählen sollte.
Diese Abfrage hier ist nicht gut, weil es beide Beiträge gegeben wählen wird, dass post 1
2 Tags a
& b
hat: es
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';
Diese Abfrage unten funktioniert, aber ist falsch, weil, wenn es einen Tag aaaaaaab
dann passt auch dazu:
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, %';
Ich bin auf der Suche nach einem "richtigen" und effizienten Ansatz dazu.
EDIT: Die Abfrage sollte auch Beiträge passen, die überhaupt keine Tags haben.
Vielen Dank! Wie wäre es mit Beiträgen, die keine Tags haben? Logisch sollte das auch im Ergebnis liegen. Tut mir leid, ich habe noch nicht darüber nachgedacht. –
Siehe die bearbeitete Antwort. – klin