簡體   English   中英

SQL:選擇其關系列為空的行

[英]SQL: Select Rows Where Their Relation Column Is Empty

假設我有兩個名為PostTag 的表,它們之間存在多對多關系。

如何選擇沒有附加標簽的帖子?

類似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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM