Postgresql

使用另一個表中的外鍵選擇一行

  • April 21, 2022

嗨,我正在使用 python、sqlalchemy 和 postgresql 創建關係數據庫

我有 2 個表 Users,並且Connections Users有關於每個使用者的資訊以及他們的idasprimary-keyConnections他們的id( Users.id) 作為Foreign-key 想像我將多個使用者 ID 添加到 Connections 中,片刻之後我想選擇一個使用者在他們的行中有特定資訊的Users table

例如 :

Table Users :
   Column id BIGINT primary key
   Column age INTEGER

Table Connections:
   Column user_id BIGINT ForeignKey(Users.id)
   Column Connection_id VARCHAR(100)

SELECT id FROM Connections WHERE Users(Connections.id).age = 20 limit 1;

我該怎麼辦?

首先(儘管它不適用於這種情況),您應該始終在此處包含您的 PostgreSQL 版本以及任何問題。

你指的是一個[INNER] JOIN. 這裡解釋了不同類型的連接。那裡有許多關於不同連接類型的連結。

因此,在這種情況下,我會執行以下操作:

CREATE TABLE my_user 
(
 id INT  NOT NULL, 
 age INT NOT NULL, 
 PRIMARY KEY (id)
);

CREATE TABLE connection 
(
 connection_id INT NOT NULL, 
 user_id       INT NOT NULL, 
 PRIMARY KEY (connection_id),
 CONSTRAINT conn_user_fk FOREIGN KEY (user_id) REFERENCES my_user (id)
);

填充它們:

INSERT INTO my_user VALUES (1, 50), (2, 45), (3, 73);

INSERT INTO connection (user_id, connection_id)
VALUES 
(1, 500), (1, 501), (1, 502), (1, 503), (1, 504),
(2, 601), (2, 602), (2, 603), (2, 604), (2, 605),
(3, 701), (3, 702), (3, 703), (3, 704);

然後執行以下 SQL:

SELECT 
 u.id, u.age, c.connection_id, c.user_id
FROM my_user u
JOIN connection c
 ON u.id = c.user_id;

結果:

id  age     connection_id   user_id
1   50  500     1
1   50  501     1
1   50  502     1
1   50  503     1
1   50  504     1
2   45  601     2
2   45  602     2
2   45  603     2
2   45  604     2
2   45  605     2
3   73  701     3
3   73  702     3
3   73  703     3
3   73  704     3

因此,您擁有兩個表中的所有資訊。如果您有更多欄位,您可能希望根據您的要求包括或排除它們。

一句強烈的建議。不要儲存人們的年齡。相反,儲存他們的生日並即時計算他們的年齡!

例如:

CREATE TABLE my_user_bis
(
 id INTEGER, 
 bday TIMESTAMPTZ
);

1 條記錄作為樣本:

SELECT 
 *, 
 AGE(CURRENT_DATE, bday::DATE),
 EXTRACT(YEAR from AGE(bday))
FROM my_user_bis;

結果:

id        bday             age                          date_part
1   2000-05-05 00:00:00+01  21 years 11 mons 16 days    21

如果您不儲存生日並即時進行計算,您將開始收到錯誤 - 如果現在 53 歲的人在 3 年內訪問記錄會發生什麼 - 它仍會將他顯示為 53 歲。除非您實施一些每年年底都會觸發一次可怕的黑客攻擊!呸!我的建議是儲存生日——如果使用者願意提供他們的年齡,那麼他們沒有理由不提供生日!

歡迎來到 dba.se!

引用自:https://dba.stackexchange.com/questions/311172