[英]SQL: Select Rows Where Their Relation Column Is Empty
假設我有兩個名為Post和Tag 的表,它們之間存在多對多關系。
如何選擇沒有附加標簽的帖子?
類似posts.where(post => post.tags.length === 0 )
使用左連接:
SELECT *
FROM posts
LEFT JOIN tags ON tags.post_id = posts.id
WHERE tags.id IS NULL;
使用不存在:
SELECT *
FROM posts
WHERE NOT EXISTS (
SELECT id FROM tags WHERE tags.post_id = posts.id
);
使用不在:
SELECT *
FROM posts
WHERE posts.id NOT IN (
SELECT DISTINCT post_id FROM tags
);
嘗試:
SELECT post.*
FROM post LEFT OUTER JOIN tag
ON post.<link_field> = tag.<link_field>
WHERE tag.<any_field> IS NULL;
當沒有相關(鏈接)標簽時,LEFT OUTER JOIN 將產生標簽字段的所有帖子和 NULL 結果。 所以如果你過濾:
WHERE tag.<any_field> IS NULL
你只會得到沒有標簽的帖子。
這是使用 PostgreSQL 進行測試的,但應該適用於任何合理的數據庫系統,因為它是純 SQL 標准。
希望這可以幫助!
這兩個表沒有(或它們不應該)有直接的多對多關系。
為此,您必須創建另一個表:
CREATE TABLE posts_tags(
post_id INT,
tag_id INT,
PRIMARY KEY (post_id, tag_id),
FOREIGN KEY(post_id) REFERENCES posts(id),
FOREIGN KEY(tag_id) REFERENCES tags(id)
)
您保存所有相關帖子和標簽的位置。
使用此表,您可以跟蹤所有沒有附加標簽的帖子:
SELECT p.*
FROM posts p LEFT JOIN posts_tags pt
ON pt.post_id = p.id
WHERE pt.post_id IS NULL
或NOT EXISTS
:
SELECT p.*
FROM posts p
WHERE NOT EXISTS (SELECT 1 FROM posts_tags WHERE post_id = p.id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.